JAVA設計模式之 代理模式【Proxy Pattern】
一、概述
給某一個物件提供一個代理,並由代理物件來完成對原物件的訪問。代理模式是一種物件結構型模式。
二、適用場景
當無法直接訪問某個物件或訪問某個物件存在困難時可以通過一個代理物件來間接訪問,為了保證客戶端使用的透明性,委託物件與代理物件需要實現相同的介面。
三、UML類圖
四、參與者
1、介面類:Subject
它宣告瞭真實訪問者和代理訪問者的共同介面,客戶端通常需要針對介面角色進行程式設計。
2、代理類:ProxySubject
包含了對真實(委託)物件(RealSubject)的引用,在實現的介面方法中呼叫引用物件的介面方法執行,從而達到代理的作用。看似是代理物件(ProxySubject)在操作,但其實真正的操作者是委託物件(RealSubject)。
3、委託類/真實訪問類:RealSubject
它定義了代理角色所代表的真實物件,在真實角色中實現了真實的業務操作,客戶端可以通過代理角色間接呼叫真實角色中定義的操作。
五、用例學習
1、介面類:Subject.java
/**
* 介面類
* @author lvzb.software@qq.com
*
*/
public interface Subject {
public void visit();
}
2、介面實現類,真實訪問物件/委託物件:RealSubject.java
/**
* 介面實現類,真實訪問物件/委託物件
* @author lvzb.software@qq.com
*
*/
public class RealSubject implements Subject {
@Override
public void visit() {
System.out.println("I am 'RealSubject',I am the execution method");
}
}
3、介面實現類,代理物件:ProxySubject.java
/**
* 介面實現類,代理物件
* @author lvzb.software@qq.com
*
*/
public class ProxySubject implements Subject {
// 維持對真實委託物件的引用,該物件才是真正的執行者
private Subject realSubject;
public ProxySubject(Subject subject){
this.realSubject = subject;
}
@Override
public void visit() {
// 真實委託物件 通過 代理物件的引用 間接的實現了對目標物件的訪問執行
realSubject.visit();
}
}
4、客戶類 Client.java
/**
* 客戶類
* @author lvzb.software@qq.com
*
*/
public class Client {
public static void main(String[] args) {
Subject proxySubject = new ProxySubject(new RealSubject());
proxySubject.visit();
}
}
六、其他/擴充套件
按照代理類的建立時期,代理類可以分為兩種:
1、靜態代理:由程式設計師建立或特定工具自動生成原始碼,再對其編譯。在程式執行前,代理類的.class檔案就已經存在了。(上面用例介紹的就是 靜態代理技術)
靜態代理的優劣分析:
優點:客戶端面向介面程式設計,符合開閉原則,使系統具有好的靈活性和擴充套件性。
缺點:從上面程式碼中我們可以發現 每一種代理類都是實現了特定的介面,及每一種代理類只能為特定介面下的實現類做代理。如果是不同介面下的其他實現類,則需要重新定義新介面下的代理類。
那麼是否可以通過一個代理類完成不同介面下實現類的代理操作呢?那麼此時就必須使用動態代理來完成。
2、動態代理:在程式執行時,運用JAVA反射機制動態建立代理例項。
【預告:關於動態代理技術 小呂將會在下一篇中詳細介紹】
—————————————————————————————————————
如果文章內容對您有幫助, 不要忘記 頂 一下,來支援一下哦!
如果您對文章內容有任何疑問或有更好的見解, 可以通過評論留言或發郵件的方式聯絡我:
ice_zhengbin@163.com / ice.zhengbin@gmail.com
如果需要轉載,請註明出處,謝謝!!
—————————————————————————————————————
相關文章
- 設計模式之代理模式(proxy pattern)設計模式
- C#設計模式——代理模式(Proxy Pattern)C#設計模式
- 代理模式(Proxy Pattern)模式
- Java中的代理模式(Proxy Pattern)Java模式
- 設計模式系列之代理模式(Proxy Pattern)——物件的間接訪問設計模式物件
- C++設計模式之Proxy模式(代理模式)C++設計模式
- java23中設計模式–代理模式ProxyJava設計模式
- java23中設計模式--代理模式ProxyJava設計模式
- Java設計模式之代理模式Java設計模式
- Java設計模式之(五)——代理模式Java設計模式
- 說透設計模式-代理模式與Proxy設計模式
- 12.java設計模式之代理模式Java設計模式
- Head First 設計模式 —— 13. 代理 (Proxy) 模式設計模式
- 設計模式之策略模式和狀態模式(strategy pattern & state pattern)設計模式
- 設計模式之單例模式(Singleton Pattern)設計模式單例
- Java設計模式—代理模式Java設計模式
- Java設計模式-代理模式Java設計模式
- 設計模式之代理模式設計模式
- 《設計模式》之代理模式設計模式
- Java設計模式之七 —– 享元模式和代理模式Java設計模式
- 4/24 設計模式之命令設計模式 Command Pattern設計模式
- 1/24 設計模式之策略設計模式 Strategy Pattern設計模式
- 設計模式之介面卡模式(adapter pattern)設計模式APT
- 設計模式之裝飾器模式(decorator pattern)設計模式
- 設計模式之觀察者模式(Observer Pattern)設計模式Server
- Java 設計模式(四)《代理模式》Java設計模式
- Javascript設計模式之代理模式JavaScript設計模式
- 代理模式(Proxy)模式
- 設計模式之委派模式(Delegate Pattern)深入淺出設計模式
- 設計模式之代理設計模式
- 設計模式漫談之代理模式設計模式
- C++設計模式之代理模式C++設計模式
- 23天設計模式之代理模式設計模式
- Java進階篇設計模式之七 ----- 享元模式和代理模式Java設計模式
- Java進階篇設計模式之七 —– 享元模式和代理模式Java設計模式
- 設計模式系列之工廠模式三兄弟(Factory Pattern)設計模式
- 12/24 設計模式之介面卡模式 Adapter Pattern設計模式APT
- 大型Java進階專題(六)設計模式之代理模式Java設計模式
- 23種設計模式之代理模式(靜態代理)設計模式