文章轉載自:http://www.cnblogs.com/mengdd/archive/2013/01/30/2883468.html
代理模式
代理模式的作用是:爲其他對象提供一種代理以控制對這個對象的訪問。
在某些情況下,一個客戶不想或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
代理模式一般涉及到的角色
抽象角色:聲明真實對象和代理對象的共同接口。
代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能夠代替真實對象。
同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。
真實角色:代理角色所代表的真實對象,是我們最終要引用的對象。
用實例來說明
首先是抽象角色類,可以定義一個接口或者抽象類:
/** * 真實對象和代理對象的共同接口 * */ public abstract class Subject { public abstract void request(); }
之後是真實角色的類,實現接口,並完成實際工作:
/** * 真實角色 */ public class RealSubject extends Subject { @Override public void request() { System.out.println("From Real Subject!"); } }
然後定義代理角色,內部包含對真實角色對象的引用,並且封裝功能:
/** * 代理角色 * */ public class ProxySubject extends Subject { //代理角色對象內部含有對真實對象的引用 private RealSubject realSubject; @Override public void request() { //在真實角色操作之前所附加的操作 preRequest(); if(null == realSubject) { realSubject = new RealSubject(); } //真實角色所完成的事情 realSubject.request(); //在真實角色操作之後所附加的操作 postRequest(); } private void preRequest() { System.out.println("Pre Request."); } private void postRequest() { System.out.println("Post Request"); } }
在客戶端進行調用時:
/** * 客戶類 * */ public class Client { public static void main(String[] args) { Subject subject = new ProxySubject(); subject.request(); } }
問題
如果要按照上述的方式(靜態代理)使用代理模式,那麼真實角色必須是實現已經存在的,並將其作爲代理對象的內部屬性。
但是實際使用時,一個真實角色必須對應一個代理角色,但如果大量使用會導致類的急劇膨脹;此外,如果事先並不知道真實角色,該如何使用代理呢?這個問題可以通過Java的動態代理類來解決。
參考資料
聖思園張龍老師Java SE系列視頻教程。