原文地址:http://te-amo.site/user/article/info/ARTICLE20180422043104194
文章中部分定義和解釋性文字,都是引用百度百科,主要的代碼及場景應用爲本人原創
代理模式爲其他對象提供一種代理以控制對這個對象的訪問。代理對象在客戶端和目標對象之間起到中介的作用。
場景:在一個系統中有個統計服務,當進行統計服務之前需要檢查並開啓需要統計的資源,統計完成後需要關閉不必要的資源,避免浪費服務器資源。對於這一個需求可以使用代理模式來設計,在統計之前和之後所做的事情很統計服務本身沒有太多關係,採用這種模式可以解耦,同時也使得需要統計的資源可配置,提高靈活性。
構成
- 抽象角色:通過接口或抽象類聲明真實角色實現的業務方法。(Statistics)
- 代理角色:實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作。(ProxyStatistics)
- 真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯,供代理角色調用。(RealStatistics)
設計
實現
代碼地址:https://github.com/telundusiji/designpattern
抽象角色 統計接口
public interface Statistics {
void statistics();
}
真實角色 統計實現
@Slf4j
public class RealStatistics implements Statistics {
@Override
public void statistics() {
log.info("開始統計......");
log.info("統計完成!");
}
}
靜態代理的方式 代理角色 統計代理
@Slf4j
public class ProxyStatistics implements Statistics{
private RealStatistics realStatistics;
public ProxyStatistics(RealStatistics realStatistics){
this.realStatistics = realStatistics;
}
@Override
public void statistics() {
log.info("統計前,開啓需要統計的服務");
realStatistics.statistics();
log.info("統計結束,關閉服務!");
}
}
動態代理方式(代理角色是動態生成,所以這並不是代理角色)
@Slf4j
public class DynamicProxyStatisticsHandler implements InvocationHandler {
private RealStatistics realStatistics;
public DynamicProxyStatisticsHandler(RealStatistics realStatistics) {
this.realStatistics = realStatistics;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(realStatistics,args);
after();
return null;
}
private void before() {
log.info("統計前,開啓需要統計的服務");
}
private void after() {
log.info("統計結束,關閉服務!");
}
}
優點
- 職責清晰:真實的角色是實現實際的業務邏輯,不用關心其他非本職責的事務。
- 代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用。
java中的靜態代理和動態代理可以閱讀以下文章: