1. 程式人生 > >Android設計模式之代理模式 Proxy

Android設計模式之代理模式 Proxy

轉載自http://blog.csdn.net/l2show/article/details/46992495

一.概述

       代理模式也是平時比較常用的設計模式之一,代理模式其實就是提供了一個新的物件,實現了對真實物件的操作,或成為真實物件的替身.在日常生活中也是很常見的.例如A要租房,為了省麻煩A會去找中介,中介會替代A去篩選房子,A坐享中介篩選的結果,並且交房租也是交給中介,這就是一個典型的日常生活中代理模式的應用.平時開啟網頁,最先開到的一般都是文字,而圖片等一些大的資源都會延遲載入,這裡也是使用了代理模式.

       代理模式的組成:

       Abstract Subject:抽象主題-宣告真實主題和代理主題共同的介面

       Real Subject:真實主題-真實的物件,需要被代理主題引用

       Proxy Subject:代理主題-因為ProxySubject引用了RealSubject,並且實現了跟RealSubject一樣的介面,所以ProxySubject可以操作RealSubject,還可以提供一些附加操作,例如before & after


       代理模式常用基於場景的分類:

       1.Virtual Proxy:虛擬代理其實就是通過代理的模式對消耗資源比較大的物件做了一個延遲載入,就是什麼時候用到這個物件才去建立它.

       2.Remote Proxy:遠端代理是比較經典的應用了,類似於C/S模式(主要攔截並控制遠端方法的呼叫,做代理防火牆之類的).

       3.Smart Reference Proxy:智慧引用代理可以給引用的物件提供一些額外的操作,例如實現裡面中介Searching和Prepare contract的動作.

       4.Access Proxy;保護代理可以控制一個物件的訪問,必要時候提供一系列的許可權管理.

       5.Copy-on-write Proxy:寫時拷貝(克隆)代理其實是Virtual Proxy的分支,提供了拷貝大物件的時候只有在物件真正變化後才會進行拷貝(克隆)的操作(延遲拷貝).

       代理模式的優缺點:

       優點:

       1.代理作為呼叫著和真實物件的中間層,降低了模組間和系統的耦合性

       2.可以以一個小物件代理一個大物件,達到優化系統提高執行速度的目的

       3.提供RealSubject的許可權管理

       4.容易擴充套件,RealSubject和ProxySubject都介面化了,RealSubject更改業務後只要介面不變,ProxySubject可以不做任何修改.

       缺點:

       1.同優點1,因為呼叫者和真實物件多了一箇中間層,所以會增加呼叫響應的時間

二.實現

       這裡就拿A找中介租房為Demo來構建代理模式.

1.普通代理

       根據場景先定義一個抽象主題,IHouse,提供三個方法,分別是獲取房屋資訊,籤合同和付租金.

  1. /** 
  2.  * Created by jesse on 15-7-24. 
  3.  */
  4. publicinterface IHouse {  
  5.     void getHouseInfo();  
  6.     void signContract();  
  7.     void payFees();  
  8. }  
       接下來定義真實主題,並實現IHouse介面.增加房屋名稱和價格兩個屬性,填充藉口方法,在獲取房屋資訊的時候就把房屋名稱和價格log出來;籤合同的時候log出籤合同的時間,付租金的時候log出價格.
  1. publicclass House implements IHouse{  
  2.     privatefinal String TAG = House.class.getSimpleName();  
  3.     private String name;  
  4.     privatedouble price;  
  5.     public House(String name, double price){  
  6.         this.name = name;  
  7.         this.price = price;  
  8.     }  
  9.     @Override
  10.     publicvoid getHouseInfo() {  
  11.         Log.i(TAG, "House Info- name:" + name + "  ¥:" + price);  
  12.     }  
  13.     @Override
  14.     publicvoid signContract() {  
  15.         Log.i(TAG, "Contract:" + name + "  signed at" +  
  16.                new SimpleDateFormat("HH:mm:ss").format(SystemClock.uptimeMillis()));  
  17.     }  
  18.     @Override
  19.     publicvoid payFees() {  
  20.         Log.i(TAG, "Bill: name-" + name + "  $-" + price);  
  21.     }  
  22. }  
       定義房屋代理,同樣需要實現IHouse介面,並持有House的引用.可以看到代理類其實就像有封裝House,提供了一些附加操作,例如客戶要看房子的時候代理會先檢索自己庫存的房屋資訊,籤合同之前要準備合同之類的.
  1. publicclass ProxyHouse implements IHouse{  
  2.     privatefinal String TAG = ProxyHouse.class.getSimpleName();  
  3.     private IHouse house;  
  4.     public ProxyHouse(IHouse house){  
  5.         this.house = house;  
  6.     }  
  7.     @Override
  8.     publicvoid getHouseInfo() {  
  9.         Log.i(TAG, "searching");  
  10.         house.getHouseInfo();  
  11.         Log.i(TAG, "search finished");  
  12.     }  
  13.     @Override
  14.     publicvoid signContract() {  
  15.         Log.i(TAG, "prepare contract");  
  16.         house.signContract();  
  17.     }  
  18.     @Override
  19.     publicvoid payFees() {  
  20.         house.payFees();  
  21.     }  
  22. }  
       對於客戶來說,完全不用跟House進行直接互動,這裡先定義一個房子叫唐頓莊園,租金5k,建立一個房屋代理,把唐頓莊園委託給代理.客戶要找房子,籤合同,付租金直接找代理就行了.
  1. IHouse house = new House("Downton Abbey"5000);  
  2. IHouse proxyHouse = new ProxyHouse(house);  
  3. Log.i(TAG, "looking for a perfect house");  
  4. proxyHouse.getHouseInfo();  
  5. Log.i(TAG, "thinking");  
  6. proxyHouse.signContract();  
  7. proxyHouse.payFees();  
  8. Log.i(TAG, "so easy");  

       整個代理模式的流程可以從下面的時序圖展示出來.Client只跟代理進行互動.

2.虛擬代理

       虛擬代理前面有介紹,就是基於代理模式又做了延遲載入來節省記憶體,但是如果某個物件要在多個沒有固定時序地方使用的時候就要進行判空,也會一定程度上犧牲效能(有點像代理模式+懶漢模式).這裡還是拿租房的例子來展示.

       這裡就假設House是一個很龐大的物件,在建立的時候很耗費資源,那我們就更改成當Custom需要用它的時候才去初始化.這裡就在ProxyHouse構造的時候先判House的引用是否為空,然後才會初始化House,當然如果這裡有多執行緒併發的話可以根據不同的場景進行加鎖或者雙檢鎖來保證執行緒安全.

  1. public ProxyHouse(){  
  2.     if (null == house)  
  3.         house = new House("Downton Abbey"5000);  
  4. }  
  1. IHouse proxyHouse = new ProxyHouse();  
  2. Log.i(TAG, "looking for a perfect house");  
  3. proxyHouse.getHouseInfo();  
  4. Log.i(TAG, "thinking");  
  5. proxyHouse.signContract();  
  6. proxyHouse.payFees();  
  7. Log.i(TAG, "so easy");  
3.強制代理

       強制代理是反其道而行之的代理模式,一般情況下代理模式都是通過代理來找到真實的物件,而強制代理則是通過真實物件才能找到代理也就是說由真實物件指定代理,當然最終訪問還是通過代理模式訪問的.從名字還能看出它跟其他代理的一個不同,就是強制用代理.拿上面普通代理的例子來說,Custom看不到實體的House的時候它只能通過代理來訪問,但是由於沒有限制,Custom也可以直接繞過ProxyHouse來訪問House,但是強制代理就多了一個限制,Custom必須通過ProxyHouse才能訪問House.就像一些房東嫌麻煩,有房客直接電話過來說要看房,房東給出一箇中介的電話說你跟中介聯絡吧.

       首先需要在接口裡面新增一個獲取代理的介面

  1. publicinterface IHouse {  
  2.     void getHouseInfo();  
  3.     void signContract();  
  4.     void payFees();  
  5.     IHouse getProxy();  
  6. }  
       真實物件實現介面,並在getProxy中例項化代理,同時在其他方法裡面做代理判斷,只有使用自身自定的代理才會正常進行.
  1. publicclass House implements IHouse{  
  2.     privatefinal String TAG = House.class.getSimpleName();  
  3.     private String name;  
  4.     privatedouble price;  
  5. 相關推薦

    Android設計模式代理模式 Proxy

    轉載自http://blog.csdn.net/l2show/article/details/46992495 一.概述        代理模式也是平時比較常用的設計模式之一,代理模式其實就是提供了一個新的物件,實現了對真實物件的操作,或成為真實物件的替身.在

    設計模式 - 代理模式Proxy Pattern)

    ride proxy idt object catch 實例化 圖片 null 人在 代理模式:代理是一種常用的設計模式,其目的就是為其他對象提供一個代理以控制對某個對象的訪問。代理類負責為委托類預處理消息,過濾消息並轉發消息,以及進行消息被委托類執行後的後續處理。很多可以

    設計模式代理模式 Proxy

    net rac style and static his public 分享 con 定義與模型 ‘ 應用場景和分類 代碼實現 staticProxy 靜態代理 public interface Star { /** * 面談

    c#設計模式代理模式(Proxy Pattern)

    ole 購物 click size ont 業務 添加 .html 售票 引言 代理這個詞語,大家在現實世界已經頻繁的接觸過,例如火車站代理售票點,因為這些代理售票點的存在,我們不必要去火車站的售票處就可以查詢或者取到火車票.代理點本身是沒有能力生產車票的,我們在代理處享

    設計模式代理模式Proxy)(2)

    技術分享 strong 流程 imp pla 遠程調用 height bst 速度 代理模式是為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用,其特征是代理類與委托類有同

    java 設計模式代理模式(Proxy)

    java 設計模式之代理模式(Proxy) 1. 概述 2.適用性 3.使用知識 4.核心思想 5. 類圖 6.dome 1. 概述 為其他物件提供一種代理以控制對這個物件的訪問

    設計模式代理模式Proxy Pattern

    意圖:為其他物件提供一種代理以控制對這個物件的訪問。 主要解決:在直接訪問物件時帶來的問題,比如說:要訪問的物件在遠端的機器上。在面向物件系統中,有些物件由於某些原因(比如物件建立開銷很大,或者某些操作需要安全控制,或者需要程序外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們

    設計模式代理模式Proxy Pattern)

    應用場景 Proxy代理模式是一種結構型設計模式,主要解決的問題是:直接訪問物件時帶來的問題。 為了保持行為的一致性,代理類和委託類通常會實現相同的介面,所以在訪問者看來兩者並無區別。 代理類種類: 靜態:建立代理類再對其編譯,在程式執行前代理類的.class檔案就已

    Android設計模式代理模式

    代理模式(Proxy Pattern)也稱為委託模式。 代理模式的定義 為其它物件提供一種代理以控制對這個物件的訪問。 代理模式的使用場景 當無法或者不想直接訪問某個物件或者訪問某個物件存在困難時,可以通過一個代理物件來間接訪問,為了保證客戶端使用的透明性,委託物件與代理物件需要實現

    JAVA設計模式代理模式Proxy

    wangking717 寫道 代理模式的作用是:為其他物件提供一種代理以控制對這個物件的訪問。在某些情況下,一個客戶不想或者不能直接引用另一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用。 或者在一系列功能模組中加入一些擴充套件的功能模組,那個時候就會用到面向切

    Java設計模式代理模式Proxy

    前言:       最近在研究Retrofit開源框架的時候,其主要核心程式碼是通過註解標示引數,動態代理模式實現具體介面,反射機制進行引數解析,最終實現傳送請求。其實之前在學習Xutils原始碼的時候,Xutils 的task也是通過代理模式來訪問的。為何要採用代理模式呢?有什麼好處呢?抱著這些疑問!今天

    JAVA設計模式 代理模式Proxy Pattern】

    一、概述     給某一個物件提供一個代理,並由代理物件來完成對原物件的訪問。代理模式是一種物件結構型模式。 二、適用場景     當無法直接訪問某個物件或訪問某個物件存在困難時可以通過一個代理物件來間接訪問,為了保證客戶端使用的透明性,委託物件與代理物件需要實現相同

    設計模式代理模式Proxy Pattern)

            代理模式:代理接活,被代理人幹活。主要是用了java的多型特性,定義一個藉口, 讓代理類和被代理類都實現該介面,關鍵在於在代理類的構造方法中引用被代理類 的構造方法。 介面: public interface Start {     public void sing();     public

    研磨設計模式 代理模式Proxy)2——跟著cc學設計系列

    11.2  解決方案 11.2.1  代理模式來解決 用來解決上述問題的一個合理的解決方案就是代理模式。那麼什麼是代理模式呢? (1)代理模式定義   (2)應用代理模式來解決的思路 仔細分析上面的問題,一次性訪問多條資料,這個可能性是很難避免的,是客戶的需要。也就是說,

    設計模式代理模式(Proxy Pattern)

    1 代理模式定義 定義:給某個物件提供一個代理物件,並由代理物件控制對於原物件的訪問,即客戶不直接操控原物件,而是通過代理物件間接地操控原物件。 2 代理模式的作用 在某些情況下,一個客戶不想或者不能直接引用另一個物件,而代理物件可以在客戶端和目

    研磨設計模式 代理模式Proxy)3——跟著cc學設計系列

    11.3  模式講解 11.3.1  認識代理模式 (1)代理模式的功能 代理模式是通過建立一個代理物件,用這個代理物件去代表真實的物件,客戶端得到這個代理物件過後,對客戶端沒有什麼影響,就跟得到了真實物件一樣來使用。        當客戶端操作這個代理物件的時候,實際上功

    JAVA設計模式----------代理模式Proxy

    這裡只是簡單的介紹下最基本的代理的使用。 代理,通俗點說 :就是一個人或者一個機構代表另一個人或者另一個機構採取行動。 在一些情況下,一個客戶不想或者不能夠直接引用一個物件,而代理物件可以在客戶 端和目標物件之前起到中介的作用。代理模式給某一個物件提供一個代理物件,並由代

    研磨設計模式 代理模式Proxy)1——跟著cc學設計系列

    11.1  場景問題 11.1.1  訪問多條資料        考慮這樣一個實際應用:要一次性訪問多條資料。        這個功能的背景是這樣的;在一個HR(人力資源)應用專案中客戶提出,當選擇一個部門或是分公司的時候,要把這個部門或者分公司下的所有員工都顯示出來,而且

    設計模式代理模式

    append class copyright ssis pen 事件綁定 video play 模塊 設計模式之代理模式 Aug 12, 2015 代理,顧名思義就是幫助別人做事,GoF 對代理模式的定義如下: 代理模式(Proxy),為其他對象提供一種代理以控制對這個對

    java設計模式代理模式

    單擊 [] 部分 空間 快遞公司 存儲 交互 idt encoding 【學習難度:★★★☆☆,使用頻率:★★★★☆】 代理模式是常用的結構型設計模式之一,當無法直接訪問某個對象或訪問某個對象存在困難時可以通過一個代理對象來間接訪問,為了保證客戶端使用的透明性,所訪問的真實