Java 设计模式_代理模式(2016-08-19)
概念:
代理模式是對象的結構模式。代理模式給某一個對象提供一個代理對象,并由代理對象控制對原對象的引用。
就是一個人或者機構代表另一個人或者機構采取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
類圖:
在代理模式中的角色:
● 抽象對象角色:聲明了目標對象和代理對象的共同接口,這樣一來在任何可以使用目標對象的地方都可以使用代理對象。
● 目標對象角色:定義了代理對象所代表的目標對象。
● 代理對象角色:代理對象內部含有目標對象的引用,從而可以在任何時候操作目標對象;代理對象提供一個與目標對象相同的接口,以便可以在任何時候替代目標對象。代理對象通常在客戶端調用傳遞給目標對象之前或之后,執(zhí)行某個操作,而不是單純地將調用傳遞給目標對象。
源代碼
抽象對象角色
public abstract class AbstractObject {//操作public abstract void operation(); }
?
目標對象角色
public class RealObject extends AbstractObject {@Overridepublic void operation() {//一些操作System.out.println("一些操作");} }
?
代理對象角色
public class ProxyObject extends AbstractObject{RealObject realObject = new RealObject();@Overridepublic void operation() {//調用目標對象之前可以做相關操作System.out.println("before"); realObject.operation(); //調用目標對象之后可以做相關操作System.out.println("after");} }
?
客戶端
public class Client {public static void main(String[] args) {// TODO Auto-generated method stubAbstractObject obj = new ProxyObject();obj.operation();}}
從上面的例子可以看出代理對象將客戶端的調用委派給目標對象,在調用目標對象的方法之前跟之后都可以執(zhí)行特定的操作。
應用場景
現實世界中,秘書就相當于一個代理,老板開會,那么通知員工開會時間、布置會場、會后整理會場等等開會相關工作就可以交給秘書做,老板就只需要開會就行了,不需要親自做那些事。同理,在我們程序設計中也可使用代理模式來將由一系列無關邏輯組合在一起的代碼進行解耦合,比如業(yè)務代碼中的日志代碼就可以在代理中進行。Spring的AOP就是典型的動態(tài)代理應用。
代理模式的應用形式
(1)遠程代理(Remote Proxy) -可以隱藏一個對象存在于不同地址空間的事實。也使得客戶端可以訪問在遠程機器上的對象,遠程機器可能具有更好的計算性能與處理速度,可以快速響應并處理客戶端請求。(JAVA RMI)
(2)虛擬代理(Virtual Proxy) – 允許內存開銷較大的對象在需要的時候創(chuàng)建。只有我們真正需要這個對象的時候才創(chuàng)建。
(3)寫入時復制代理(Copy-On-Write Proxy) – 用來控制對象的復制,方法是延遲對象的復制,直到客戶真的需要為止。是虛擬代理的一個變體。
(4)保護代理(Protection (Access)Proxy) – 為不同的客戶提供不同級別的目標對象訪問權限
(5)緩存代理(Cache Proxy) – 為開銷大的運算結果提供暫時存儲,它允許多個客戶共享結果,以減少計算或網絡延遲。
(6)防火墻代理(Firewall Proxy) – 控制網絡資源的訪問,保護主題免于惡意客戶的侵害。
(7)同步代理(SynchronizationProxy) – 在多線程的情況下為主題提供安全的訪問。
(8)智能引用代理(Smart ReferenceProxy) - 當一個對象被引用時,提供一些額外的操作,比如將對此對象調用的次數記錄下來等。
(9)復雜隱藏代理(Complexity HidingProxy) – 用來隱藏一個類的復雜集合的復雜度,并進行訪問控制。有時候也稱為外觀代理(Fa?ade Proxy),這不難理解。復雜隱藏代理和外觀模式是不一樣的,因為代理控制訪問,而外觀模式是不一樣的,因為代理控制訪問,而外觀模式只提供另一組接口。
代理模式與裝飾者模式的區(qū)別
代理模式:在不改變接口的前提下,控制對象的訪問
例子:孫悟空扮演并代替高家三小姐
孫悟空扮演高家三小姐,所以可以說孫悟空與高家三小姐具有共同的接口。如果豬八戒只想 見見高家三小姐的嬌好面容,或者談談天說說地,那么高家三小姐的“代理”孫悟空是允許 的,但豬八戒想親親嘴,那么是不行的。這是保護代理模式的應用。只有代理對象認為合適 時,才會將客戶端的請求傳遞給真實主題對象。
裝飾模式:在不改變接口的前提下,動態(tài)擴展對象的功能
孫悟空有七十二般變化,在二郎神眼里,他永遠是那只猢猻。裝飾模式以對客戶透明的方式 動態(tài)地給一個對象附加上更多的責任。換言之,客戶端并不會覺得對象在裝飾前和裝飾后有 什么不同。裝飾模式可以在不使用創(chuàng)造更多子類的情況下,將對象的功能加以擴展。他的每 一種變化都給他帶來一種附加的本領。他變成魚 兒時,就可以到水里游泳;他變成雀兒時, 就可以在天上飛行。而不管悟空怎么變化,在二郎神眼里,他永遠是那只猢猻。裝飾模式以 對客戶透明的方式動態(tài)地給一個對象附加上更多的責任。換言之,客戶端并不會覺得對象在 裝飾前和裝飾后有什么不同。裝飾模式可以在不使用創(chuàng)造更多子類的情況下,將對象的功能 加以擴展。
?java動態(tài)代理
呵呵,以后再補。看不下去設計模式了。轉戰(zhàn)JavaScript的。
?
參考抄襲復制來源:
http://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html
http://blog.csdn.net/jackiehff/article/details/8621517
http://www.cnblogs.com/machine/archive/2013/02/21/2921345.html
?
轉載于:https://www.cnblogs.com/scevecn/p/5787177.html
總結
以上是生活随笔為你收集整理的Java 设计模式_代理模式(2016-08-19)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么系克电系
- 下一篇: 腹茧症能做试管婴儿吗