23種設計模式之代理模式

代理模式的定義

代理模式是一個使用率非常高的模式,其定義為: 為其他對象提供一種代理以控制對這個對象的訪問

代理模式也叫做委託模式, 它是一項基本設計技巧. 許多其他的模式, 如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了委託模式, 而且在日常的應用中, 代理模式可以提供非常好的訪問控制.

代理模式的通用類圖如下:

23種設計模式之代理模式

圖中三個角色的定義:

  1. Subject抽象主題角色, 抽象主題角色可以是抽象類也可以是接口, 是一個最普通的業務類型定義,無特殊要求
  2. RealSubject具體主題角色, 也叫做委託角色、被代理角色, 是業務邏輯的具體執行者
  3. Proxy代理主題角色, 也叫做委託類、代理類, 它負責對真實對象的應用, 把所有抽象主題類定義的方法限制委託給真實主題角色實現,並且在真實主題角色處理完畢前後做預處理和善後工作

Proxy 代碼為:

23種設計模式之代理模式

這樣就實現了一個簡單的代理

代理模式的應用

代理模式的優點:

  1. 職責清晰, 真實的角色就是實現實際的業務邏輯, 不用關心其他非本職責的事務, 通過後期的代理完成一件事務,附帶的結果就是編程簡潔清晰
  2. 高擴展性, 具體主題角色是隨時都會發生變化的, 只要它實現了接口, 甭管它如何變化, 都逃不脫接口, 我們的代理類完全就可以在不做任何修改的情況下使用
  3. 智能化

代理模式的使用場景:

為什麼要用代理模式呢?就比如打官司, 為什麼要找個律師? 因為你不想參與中間過程的是是非非, 只要完成自己的答辯就成, 其他的事前調查、事後追查等都由律師來搞定, 這就是為了減輕你的負擔

代理模式的擴展

1.普通代理模式

普通代理就是我們要知道代理的存在, 也就是 Proxy 這個類的存在,然後才能訪問,普通代理模式下的Proxy類代碼:

23種設計模式之代理模式

在這種改造下, 系統更加簡潔了, 調用者只知道代理的存在就可以,不用知道代理了誰. 屏蔽了真實角色的變更對高層模塊的影響, 真實的角色想怎麼修改就怎麼修改,對高層次的模塊沒有任何的影響, 只要你實現了接口所對應的方法,該模式非常適合對擴展性要求極高的場合.

2.強制代理

強制代理就是調用者直接調用真是角色, 而不用關心代理是否存在,其代理的產生是由真實角色決定的, 也就是說強制代理不管你是通過代理類還是通過直接new一個角色類, 都不能訪問, 只有通過真是角色指定的代理類才可以訪問, 也就是說真實對象管理代理角色. 這麼說, 高層模塊new了一個真實角色的對象, 返回的卻是代理角色.

修改後的代碼如下:

23種設計模式之代理模式

代理類如下:

23種設計模式之代理模式

真實類如下:

23種設計模式之代理模式

這樣通過使用 new RealSubject().getProxy(); 就可以通過真實角色找到代理了

強制代理的概念就是要從真實角色查找到代理角色. 高層模塊只要調用getProxy就可以訪問真實角色的所有方法, 代理的管理已經由真實角色自己完成

3.個性代理類

代理類也可以實現其他接口,實現其他方法,當然也可以代理多個真實角色,並且真實角色之間可以有耦合關係.

4.動態代理

什麼是動態代理?動態代理是在實現階段不用關心代理誰,而在運行階段才指定代理哪一個對象.

動態代理需要實現 InvocationHandler 接口:

23種設計模式之代理模式

通過 InvocationHandler 接口,所有的方法都被它接管了, 我們在使用的時候只需這樣創建代理類:

23種設計模式之代理模式

這樣, subject就是代理後的類

面向切面編程,即AOP, 其核心就是採用了動態代理機制

注意: 要實現動態代理的首要條件是, 被代理類必須實現了一個接口


代理模式應用的非常廣泛,大到一個系統框架、企業平臺,小到代碼片段、事務處理,稍不留意就用到代理模式.


分享到:


相關文章: