代理模式(proxy pattern):做用:爲其餘對象提供一種代理,以控制對這個對象的訪問。代理對象在客戶端對象和目標對象之間起中介的做用。spring
代理模式涉及到的角色:設計模式
2.代理角色:代理角色內部含有對真實對象的引用,這樣能夠操控真實的對象。同時,代理對象提供與真實對象相同的接口,以便在任什麼時候候都能代替真實的對象。另外,代理對 象在執行真實對象操做時,附加其餘的操做,至關於對真實對象進行封裝。框架
3.真實角色:它是代理對象所表明的真實角色,是咱們最終要引用的對象。ide
有圖會更形象些,看看代理模式的UML圖:學習
接下來看看代碼怎樣實現的:spa
Subject接口實現:設計
public interface Subject { public void request(); }
Proxy代理類實現:代理
/** * 代理類 * @author dcj * */
public class ProxySubject implements Subject{ private RealSubject realSubject; //含有對真實角色的引用
@Override public void request() { beforeRequest(); if(realSubject == null){ realSubject = new RealSubject(); } realSubject.request(); //真實角色所完成的事情
afterRequest(); } //代理角色附加功能,該方法不必定有,看實際狀況須要
private void beforeRequest(){ System.out.println("I'm proxy, I can do something before request"); } //代理角色附加功能,該方法不必定有,看實際狀況須要
private void afterRequest(){ System.out.println("I'm proxy, I can do something after request"); } }
真實角色:code
public class RealSubject implements Subject{ @Override public void request() { System.out.println("I'm realSubject, I perform something"); } }
客戶端類:orm
public class Client { public static void main(String[] args) { Subject subject = new ProxySubject(); subject.request(); } }
運行結果:
恩,基本就是這樣,雖然類的實現和結果都比較簡單,可是咱們應該更好的去理解這種設計思想。像struts2的攔截器,spring的Aop(aspect oriented programming),其實都運用了代理模式。將這種思想理解了,對框架的學習是頗有幫助的。
參考資料:聖思園視頻,Head Frist 設計模式