定義:
Provide a surrogate or placeholder for another object to control access to it.
為其他對象一種代理以控制對這個對象的訪問。
一般描述:
一般包含的三個角色:抽象主題、具體主題、代理主題。
通用類圖:

通用代碼:
package Proxy;//抽象主題類:public interface Subject { public void doSomething();}package Proxy;//具體主題類public class RealSubject implements Subject{ @Override public void doSomething() { System.out.println("業務邏輯..."); }}package Proxy;//代理主題類public class Proxy implements Subject{ private Subject sub = null; @Override public void doSomething() { this.sub.doSomething(); } public Proxy(Subject sub){ this.sub = sub; } }package Proxy;//客戶端public class Client { public static void main(String[] args) { Subject realsub = new RealSubject(); Subject proxy = new Proxy(realsub); proxy.doSomething(); }}優點:
1. 職責清晰
2. 高擴展
代理模式的擴展:
普通代理:
具體主題類對高層透明,在代理主題類中構造具體主題類
代碼實現:
package GeneralProxy; public interface Subject { public void doSomething();}package GeneralProxy; public class RealSubject implements Subject{ private String name = null; @Override public void doSomething() { System.out.println(this.name + "被代理,正在執行業務邏輯..."); } public RealSubject(Subject proxy,String name) throws Exception{ if(proxy == null){ throw new Exception("無法創建被代理對象"); }else{ this.name = name; } }}package GeneralProxy; public class Proxy implements Subject{ private Subject realsub = null; public Proxy(String name) { try { realsub = new RealSubject(this, name); } catch (Exception e) { e.printStackTrace(); } } public void doSomething() { realsub.doSomething(); }}package GeneralProxy; public class Client { public static void main(String[] args) { //普通代理 Subject proxy = new Proxy("張三"); proxy.doSomethaing(); } }
強制代理:
必須通過訪問具體主題類獲取代理主題類的對象,然后用代理主題類控制訪問
代碼實現:
package MustProxy; public interface Subject { public void doSomething(); public Subject getProxy();}package MustProxy; public class RealSubject implements Subject{ private String name = null; private Subject proxy = null; @Override public void doSomething() { if(isProxy()){ System.out.println(this.name + "被代理,正在執行業務邏輯..."); }else{ System.out.println("請先訪問代理..."); } } public RealSubject(String name) { this.name = name; } public Subject getProxy() { proxy = new Proxy(this); return this.proxy; } private boolean isProxy(){ if(this.proxy == null){ return false; }else{ return true; } }}package MustProxy; public class Proxy implements Subject{ private Subject realSub = null; public Proxy(Subject realSub) { this.realSub = realSub; } public void doSomething() { this.realSub.doSomething(); } public Subject getProxy() { return this; }}package MustProxy; public class Client { public static void main(String[] args) { Subject realSub = new RealSubject("張三"); realSub.doSomething(); Subject proxy = realSub.getProxy(); proxy.doSomething(); }}應用場景
現實世界中,秘書就相當于一個代理,老板開會,那么通知員工開會時間、布置會場、會后整理會場等等開會相關工作就可以交給秘書做,老板就只需要開會就行了,不需要親自做那些事。同理,在我們程序設計中也可使用代理模式來將由一系列無關邏輯組合在一起的代碼進行解耦合,比如業務代碼中的日志代碼就可以在代理中進行。Spring的AOP就是典型的動態代理應用。
代理模式的應用形式
(1)遠程代理(Remote Proxy) -可以隱藏一個對象存在于不同地址空間的事實。也使得客戶端可以訪問在遠程機器上的對象,遠程機器可能具有更好的計算性能與處理速度,可以快速響應并處理客戶端請求。
(2)虛擬代理(Virtual Proxy)
主站蜘蛛池模板:
宽甸|
肇东市|
汪清县|
平遥县|
平南县|
电白县|
和硕县|
宜兰市|
仁怀市|
天镇县|
观塘区|
青阳县|
溆浦县|
东乡|
恩平市|
遵义市|
乌兰浩特市|
平远县|
锡林郭勒盟|
英德市|
西畴县|
池州市|
六枝特区|
肇源县|
长宁区|
罗山县|
芜湖市|
启东市|
正定县|
元氏县|
枞阳县|
赣榆县|
和平县|
专栏|
金平|
翁源县|
梨树县|
北京市|
通山县|
建平县|
丹阳市|