代理模式(一)

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

二、類圖


proxy.png

三、代理三要素
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)代理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近看了馬士兵老師的設(shè)計(jì)模式視頻,感覺其中最難也最感興趣的就是代理模式了。馬士兵老師從靜態(tài)代理的兩種基本方式出發(fā),...
    偷星辰夜閱讀 455評(píng)論 0 0
  • 1. 定義 為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。 2. 使用場(chǎng)景 當(dāng)想對(duì)某個(gè)對(duì)象做功能增強(qiáng)拓展,但又不想...
    程序員修仙閱讀 444評(píng)論 1 2
  • 本篇文章繼續(xù)介紹Java反射機(jī)制,不同的是側(cè)重于介紹動(dòng)態(tài)代理。動(dòng)態(tài)代理是代理模式中的一種,是通過Java反射機(jī)制來...
    Android進(jìn)階與總結(jié)閱讀 670評(píng)論 0 0
  • 青春歲月里,污穢叫懵懂,作妖叫釋放,打架叫增進(jìn)友誼,起外號(hào)叫加深記憶! 當(dāng)年,我們班級(jí)起外號(hào)很盛行。 有個(gè)男生個(gè)子...
    李哈利閱讀 199評(píng)論 0 1
  • 我在四季不分的地方 揣測(cè)你城市的春天 是冰開燕來的聲色犬馬 是傾倒三月的一樹花開 用充斥馥郁的煙火 來一場(chǎng)雪的葬禮...
    道路沉默閱讀 130評(píng)論 2 1

友情鏈接更多精彩內(nèi)容