代理模式
代理模式的定義
代理模式(Proxy Pattern)是一個使用率非常高的模式,其定義如下:
Provide a surrogate or placeholder for another object to control access to it.(爲其他對象提供一種代理以控制對象的訪問)。
代理模式也叫做委託模式,它是一項基本設計技巧。許多其他的模式,如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了委託模式,而且在日常的應用中,代理模式可以提供非常好的訪問控制。
代理模式的通用類圖如下:
三個角色的定義:
- Subject抽象主題角色
抽象主題類可以是抽象類也可以是接口,是一個最普通的業務類型定義,無特殊要求。 - RealSubject具體主題角色
也叫做被委託角色、被代理角色。它纔是冤大頭,是業務邏輯的具體執行者。 - Proxy代理主題角色
也叫做委託類、代理類。它負責對真實角色的應用,把所有抽象主題類定義的方法限制委託給真實主題角色實現,並且在真實主題角色處理完畢前後做預處理和善後處理工作。
抽象主題類:
public interface Subject {
// 定義一個方法
public void request();
}
真實主題類:
public class RealSubject implements Subject{
// 實現方法
@Override
public void request() {
// 業務邏輯處理
}
}
代理類:
public class Proxy implements Subject{
// 要代理那個實現類
private Subject subject = null;
// 默認被代理者
public Proxy(){
this.subject = new Proxy();
}
// 通過構造函數傳遞代理者
public Proxy(Object...objects ){
}
// 實現接口中定義的方法
@Override
public void request() {
this.before();
this.subject.request();
this.after();
}
// 預處理
private void before(){
// do something
}
// 善後處理
private void after(){
// do something
}
}
一個代理類可以代理多個被委託者或被代理者,因此一個代理類具體代理那個真實主題角色,是由場景類決定的。
代理的構造函數:
public Proxy(Subject _subject){
this.subject = _subject;
}
代理模式的應用
代理模式的優點
職責清晰
高擴展性
智能化
代理模式的使用場景
代理模式的使用場景非常多,大家可以看看Spring AOP,這是一個非常典型的動態代理。