代理模式的定義 代理模式是一個使用率非常高的模式,其定義為: 為其他對象提供一種代理以控制對這個對象的訪問 代理模式也叫做委托模式, 它是一項基本設計技巧. 許多其他的模式, 如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了委托模式, 而且在日常的應用中, 代理模式可以提供非常好的訪問控 ...
代理模式的定義
代理模式是一個使用率非常高的模式,其定義為: 為其他對象提供一種代理以控制對這個對象的訪問
代理模式也叫做委托模式, 它是一項基本設計技巧. 許多其他的模式, 如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了委托模式, 而且在日常的應用中, 代理模式可以提供非常好的訪問控制.
代理模式的通用類圖如下:
圖中三個角色的定義:
- Subject抽象主題角色, 抽象主題角色可以是抽象類也可以是介面, 是一個最普通的業務類型定義,無特殊要求
- RealSubject具體主題角色, 也叫做委托角色、被代理角色, 是業務邏輯的具體執行者
- Proxy代理主題角色, 也叫做委托類、代理類, 它負責對真實對象的應用, 把所有抽象主題類定義的方法限制委托給真實主題角色實現,並且在真實主題角色處理完畢前後做預處理和善後工作
Proxy 代碼為:
這樣就實現了一個簡單的代理
代理模式的應用
代理模式的優點:
- 職責清晰, 真實的角色就是實現實際的業務邏輯, 不用關心其他非本職責的事務, 通過後期的代理完成一件事務,附帶的結果就是編程簡潔清晰
- 高擴展性, 具體主題角色是隨時都會發生變化的, 只要它實現了介面, 甭管它如何變化, 都逃不脫介面, 我們的代理類完全就可以在不做任何修改的情況下使用
- 智能化
代理模式的使用場景:
為什麼要用代理模式呢?就比如打官司, 為什麼要找個律師? 因為你不想參與中間過程的是是非非, 只要完成自己的答辯就成, 其他的事前調查、事後追查等都由律師來搞定, 這就是為了減輕你的負擔
代理模式的擴展
1.普通代理模式
普通代理就是我們要知道代理的存在, 也就是 Proxy 這個類的存在,然後才能訪問,普通代理模式下的Proxy類代碼:
在這種改造下, 系統更加簡潔了, 調用者只知道代理的存在就可以,不用知道代理了誰. 屏蔽了真實角色的變更對高層模塊的影響, 真實的角色想怎麼修改就怎麼修改,對高層次的模塊沒有任何的影響, 只要你實現了介面所對應的方法,該模式非常適合對擴展性要求極高的場合.
2.強制代理
強制代理就是調用者直接調用真是角色, 而不用關心代理是否存在,其代理的產生是由真實角色決定的, 也就是說強制代理不管你是通過代理類還是通過直接new一個角色類, 都不能訪問, 只有通過真是角色指定的代理類才可以訪問, 也就是說真實對象管理代理角色. 這麼說, 高層模塊new了一個真實角色的對象, 返回的卻是代理角色.
修改後的代碼如下:
代理類如下:
真實類如下:
這樣通過使用 new RealSubject().getProxy(); 就可以通過真實角色找到代理了
強制代理的概念就是要從真實角色查找到代理角色. 高層模塊只要調用getProxy就可以訪問真實角色的所有方法, 代理的管理已經由真實角色自己完成
3.個性代理類
代理類也可以實現其他介面,實現其他方法,當然也可以代理多個真實角色,並且真實角色之間可以有耦合關係.
4.動態代理
什麼是動態代理?動態代理是在實現階段不用關心代理誰,而在運行階段才指定代理哪一個對象.
動態代理需要實現 InvocationHandler 介面:
通過 InvocationHandler 介面,所有的方法都被它接管了, 我們在使用的時候只需這樣創建代理類:
這樣, subject就是代理後的類
面向切麵編程,即AOP, 其核心就是採用了動態代理機制
註意: 要實現動態代理的首要條件是, 被代理類必須實現了一個介面
代理模式應用的非常廣泛,大到一個系統框架、企業平臺,小到代碼片段、事務處理,稍不留意就用到代理模式.