一、定義
為其它對(duì)象提供一種代理,以控制對(duì)這對(duì)象的訪問。
二、類圖

三、代理三要素
1.Subject 抽象主題角色(共同接口)
可以是抽象類或者接口,是一個(gè)最普通的業(yè)務(wù)類型定義,無特殊要求。
public interface Subject {
//定義一個(gè)方法
public void request();
}
2.RealSubject 具體主題角色(真實(shí)對(duì)象)
也叫被代理角色。是業(yè)務(wù)邏輯的具體執(zhí)行者。
public class RealSubject implements Subject {
//實(shí)現(xiàn)方法
public void request() {
// TODO 業(yè)務(wù)邏輯處理
}
}
3.Proxy 代理主題角色(代理對(duì)象)
也叫代理類。負(fù)責(zé)對(duì)真實(shí)角色的應(yīng)用,把所有抽象主題類定義的方法限制委托給真實(shí)主題角色去實(shí)現(xiàn),并且在真實(shí)主題角色處理完畢前后做預(yù)處理和善后操作。
public class Proxy implements Subject {
//要代理哪個(gè)實(shí)現(xiàn)類
private Subject subject = null;
//通過構(gòu)造函數(shù)傳遞代理者
public Proxy(Subject subject){
this.subject = subject;
}
//實(shí)現(xiàn)接口中定義的方法
public void request() {
this.before();
this.subject.request();
this.after();
}
//預(yù)處理
private void before(){
//do something
}
//善后處理
private void after(){
//do something
}
}
四、優(yōu)點(diǎn)
1.職責(zé)清晰
真實(shí)角色就是實(shí)現(xiàn)實(shí)際的業(yè)務(wù)邏輯,而不需要關(guān)心其他非本職工作(例如前處理、后處理),通過代理完成一件事務(wù),結(jié)果就是編程簡潔清晰。
2.高擴(kuò)展性
具體的主題角色是隨時(shí)都可能發(fā)生變化的,當(dāng)需要改變時(shí),通過代理類,我們就可以做到不修改原角色下實(shí)現(xiàn)擴(kuò)展。
五、使用場(chǎng)景
通常用于對(duì)原有邏輯進(jìn)行擴(kuò)展。比如現(xiàn)在持有二方包的某些類,需要調(diào)用其中的某些方法并添加一些方法,例如打印日志等,但是又不方便將這些邏輯直接加在二方包的方法里,那么我們就可以通過使用代理的方式來進(jìn)行。
擴(kuò)展:一方包、二方包、三方包是什么?
一方包:本工程內(nèi)的各模塊的相互依賴
二方包:公司內(nèi)部的依賴庫,一般指公司內(nèi)部的其他項(xiàng)目發(fā)布的jar包
三方包:公司之外的開源庫,比如apache、google等發(fā)布的依賴
也許你現(xiàn)在還覺得很郁悶,為什么要使用代理。但是想想現(xiàn)實(shí)世界中,打官司為什么要找個(gè)律師?因?yàn)槟悴幌雲(yún)⑴c到中間過程的是是非非,只需要完成自己的答辯,其它諸如事前調(diào)查、事后追查都由律師來搞定,這就是為了減輕你的負(fù)擔(dān)。
六、擴(kuò)展
靜態(tài)代理和動(dòng)態(tài)代理的介紹,可以參考下一篇 靜態(tài)代理和動(dòng)態(tài)代理