學編程吧JAVA設計模式之代理模式發佈了,歡迎通過xuebiancheng8.com來訪問
一、概述
給某一個對象提供一個代理,並由代理對象來完成對原對象的訪問。代理模式是一種對象結構型模式。
二、適用場景
當無法直接訪問某個對象或訪問某個對象存在困難時可以通過一個代理對象來間接訪問,爲了保證客戶端使用的透明性,委託對象與代理對象需要實現相同的接口。
三、UML類圖
四、參與者
1、接口類:Subject
它聲明瞭真實訪問者和代理訪問者的共同接口,客戶端通常需要針對接口角色進行編程。
2、代理類:ProxySubject
包含了對真實(委託)對象(RealSubject)的引用,在實現的接口方法中調用引用對象的接口方法執行,從而達到代理的作用。看似是代理對象(ProxySubject)在操作,但其實真正的操作者是委託對象(RealSubject)。
3、委託類/真實訪問類:RealSubject
它定義了代理角色所代表的真實對象,在真實角色中實現了真實的業務操作,客戶端可以通過代理角色間接調用真實角色中定義的操作。
五、用例學習
1、接口類:Subject.java
[java] view plaincopy
public interface Subject {
public void visit();
}
2、接口實現類,真實訪問對象/委託對象:RealSubject.java
[java] view plaincopy
public class RealSubject implements Subject {
@Override
public void visit() {
System.out.println("I am 'RealSubject',I am the execution method");
}
}
3、接口實現類,代理對象:ProxySubject.java
[java] view plaincopy
public class ProxySubject implements Subject {
// 維持對真實委託對象的引用,該對象纔是真正的執行者
private Subject realSubject;
public ProxySubject(Subject subject){
this.realSubject = subject;
}
@Override
public void visit() {
// 真實委託對象 通過 代理對象的引用 間接的實現了對目標對象的訪問執行
realSubject.visit();
}
}
4、客戶類 Client.java
[java] view plaincopy
public class Client {
public static void main(String[] args) {
Subject proxySubject = new ProxySubject(new RealSubject());
proxySubject.visit();
}
}
六、其他/擴展
按照代理類的創建時期,代理類可以分爲兩種:
1、靜態代理:由程序員創建或特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。(上面用例介紹的就是 靜態代理技術)
靜態代理的優劣分析:
優點:客戶端面向接口編程,符合開閉原則,使系統具有好的靈活性和擴展性。
缺點:從上面代碼中我們可以發現 每一種代理類都是實現了特定的接口,及每一種代理類只能爲特定接口下的實現類做代理。如果是不同接口下的其他實現類,則需要重新定義新接口下的代理類。
那麼是否可以通過一個代理類完成不同接口下實現類的代理操作呢?那麼此時就必須使用動態代理來完成。
2、動態代理:在程序運行時,運用JAVA反射機制動態創建代理實例。
【預告:關於動態代理技術 小呂將會在下一篇中詳細介紹】
—————————————————————————————————————
如果文章內容對您有幫助, 不要忘記 頂 一下,來支持一下哦!
如果您對文章內容有任何疑問或有更好的見解, 可以通過評論留言或發郵件的方式聯繫我:
[email protected] / [email protected]
如果需要轉載,請註明出處,謝謝!!
學編程吧JAVA設計模式之代理模式發佈了,歡迎通過xuebiancheng8.com來訪問