23種設(shè)計(jì)模式(7)-代理模式

定義:

為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問徐紧。在某些情況下儒飒,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用

角色:

1米辐,抽象角色:聲明真實(shí)對(duì)象和代理對(duì)象的共同接口栓始。

2务冕,代理角色:代理對(duì)象角色內(nèi)部含有對(duì)真實(shí)對(duì)象的引用血当,從而可以操作真實(shí)對(duì)象幻赚,同時(shí)代理對(duì)象提供與真實(shí)對(duì)象相同的接口以便在任何時(shí)刻都能代替真實(shí)對(duì)象。同時(shí)臊旭,代理對(duì)象可以在執(zhí)行真實(shí)對(duì)象操作時(shí)落恼,附加其他的操作,相當(dāng)于對(duì)真實(shí)對(duì)象進(jìn)行封裝离熏。

3佳谦,真實(shí)角色:代理角色所代表的真實(shí)對(duì)象,是我們最終要引用的對(duì)象滋戳。

分類:

靜態(tài)代理

靜態(tài)代理也就是在程序運(yùn)行前就已經(jīng)存在代理類的字節(jié)碼文件钻蔑,代理類和委托類的關(guān)系在運(yùn)行前就確定了。

示例:

抽象角色奸鸯,真實(shí)對(duì)象和代理對(duì)象共同的接口

publicinterfaceUserInfo{publicvoidqueryUser();publicvoidupdateUser(); ? ? ?}

真實(shí)角色

public class UserImpl implementsUserInfo{

@Override

public void queryUser() {

//查詢方法略...

}

@Override

public void updateUser() {

//修改方法略...

}

}

代理角色

publicclassUserProxyimplementsUserInfo{privateUserInfo userImpl;publicAccountProxy(UserInfo userImpl){this.userImpl = userImpl; ? ? ? } ? ? ? @OverridepublicvoidqueryUser(){//這里可以擴(kuò)展咪笑,增加一些查詢之前需要執(zhí)行的方法//查詢方法略...//這里可以擴(kuò)展,增加一些查詢之后需要執(zhí)行的方法} ? ? ? @OverridepublicvoidupdateUser(){//這里可以擴(kuò)展娄涩,增加一些修改之前需要執(zhí)行的方法//修改方法略...//這里可以擴(kuò)展窗怒,增加一些修改之后需要執(zhí)行的方法} ?}

使用代理之后如何調(diào)用他的方法?

public class Test {

public static void main(String[] args) {

UserInfo userImpl = new UserImpl();

UserInfo userProxy = new UserProxy(userImpl);

userProxy.queryUser();

userProxy.updateUser();

}

}

動(dòng)態(tài)代理

動(dòng)態(tài)代理類的源碼是程序在運(yùn)行期間由JVM根據(jù)反射等機(jī)制動(dòng)態(tài)生成的蓄拣,所以不存在代理類的字節(jié)碼文件扬虚。代理角色和真實(shí)角色的聯(lián)系在程序運(yùn)行時(shí)確定。

示例:

抽象角色球恤,真實(shí)對(duì)象和代理對(duì)象共同的接口

public interface UserInfo{

public void queryUser ();

public void updateUser ();

}

真實(shí)角色

public class UserImpl implementsUserInfo{

@Override

public void queryUser() {

//查詢方法略...

}

@Override

public void updateUser() {

//修改方法略...

}

}

代理角色處理器:

public class UserHandler implementsInvocationHandler{ ? ? ? ? privateUserInfo userImpl; ? ? ? ? publicUserHandler(UserInfo userImpl2){ ? ? ? ? ? ? ? ? ? this.userImpl= userImpl2; ? ? ? ? } ? ? ? ? @Override ? ? ? ? publicObject invoke(Object proxy, Method method, Object[] args)

throws Throwable { ? ? ? ? ? ? ? ? ? Objectobject = null; ? ? ? //方法開始前做一些事情 ? ? ? if (method.getName().equals("queryUser")) { ? ? ? ? ? object = method.invoke(userImpl, args);

//激活調(diào)用的方法 ?? ? ? ? } ? ? ? //方法結(jié)束后做一些事情 ? ? ? return object; ? ?}}

如何調(diào)用(和靜態(tài)代理略有不同)

publicclassTest{

public staticvoidmain(String[] args){ ? ? ? ? UserInfouserImpl =newUserImpl(); ? ? ? ? UserHandlerhandler =newUserHandler(userImpl); ? ? ? ? UserInfouserProxy = (UserInfo)Proxy.newProxyInstance ? ? ? ? ? ? ? ? ? ? ?(ClassLoader.getSystemClassLoader(), ? ? ? ? ? ? ? ? ? ? ? ?newClass[]{UserInfo.class}, handler); ? ? ? ? userProxy.queryUser(); ? ? ? ? }}

優(yōu)點(diǎn):

業(yè)務(wù)類只需要關(guān)注業(yè)務(wù)邏輯本身辜昵,保證了業(yè)務(wù)類的重用性。這是代理的共有優(yōu)點(diǎn)咽斧。

能夠協(xié)調(diào)調(diào)用者和被調(diào)用者堪置,在一定程度上降低了系統(tǒng)的耦合度贷洲。

缺點(diǎn):

由于在客戶端和真實(shí)主題之間增加了代理對(duì)象,因此有些類型的代理模式可能會(huì)造成請(qǐng)求的處理速度變慢晋柱,例如保護(hù)代理优构。

實(shí)現(xiàn)代理模式需要額外的工作,而且有些代理模式的實(shí)現(xiàn)過程較為復(fù)雜雁竞,例如遠(yuǎn)程代理钦椭。

Java知音公眾號(hào)整理一些各大公司常用的面試筆試題,供大家在每天閑暇之余學(xué)習(xí)其中幾道題目碑诉,同時(shí)不定期推送Java開發(fā)相關(guān)技能彪腔,讓您在不知不覺中提高自己!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末进栽,一起剝皮案震驚了整個(gè)濱河市德挣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌快毛,老刑警劉巖格嗅,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異唠帝,居然都是意外死亡屯掖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門襟衰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贴铜,“玉大人,你說我怎么就攤上這事瀑晒∩馨樱” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵苔悦,是天一觀的道長轩褐。 經(jīng)常有香客問我,道長间坐,這世上最難降的妖魔是什么灾挨? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮竹宋,結(jié)果婚禮上劳澄,老公的妹妹穿的比我還像新娘。我一直安慰自己蜈七,他們只是感情好秒拔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飒硅,像睡著了一般砂缩。 火紅的嫁衣襯著肌膚如雪作谚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天庵芭,我揣著相機(jī)與錄音妹懒,去河邊找鬼。 笑死双吆,一個(gè)胖子當(dāng)著我的面吹牛眨唬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播好乐,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼匾竿,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蔚万?” 一聲冷哼從身側(cè)響起岭妖,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎反璃,沒想到半個(gè)月后昵慌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡版扩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年废离,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侄泽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片礁芦。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悼尾,靈堂內(nèi)的尸體忽然破棺而出柿扣,到底是詐尸還是另有隱情,我是刑警寧澤闺魏,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布未状,位于F島的核電站,受9級(jí)特大地震影響析桥,放射性物質(zhì)發(fā)生泄漏司草。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一泡仗、第九天 我趴在偏房一處隱蔽的房頂上張望埋虹。 院中可真熱鬧,春花似錦娩怎、人聲如沸搔课。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爬泥。三九已至柬讨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袍啡,已是汗流浹背踩官。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留境输,地道東北人卖鲤。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像畴嘶,于是被迫代替她去往敵國和親蛋逾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理窗悯,服務(wù)發(fā)現(xiàn)区匣,斷路器,智...
    卡卡羅2017閱讀 134,695評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法蒋院,類相關(guān)的語法亏钩,內(nèi)部類的語法,繼承相關(guān)的語法欺旧,異常的語法姑丑,線程的語...
    子非魚_t_閱讀 31,660評(píng)論 18 399
  • 1 場(chǎng)景問題# 1.1 訪問多條數(shù)據(jù)## 考慮這樣一個(gè)實(shí)際應(yīng)用:要一次性訪問多條數(shù)據(jù)。 這個(gè)功能的背景是這樣的辞友;在...
    七寸知架構(gòu)閱讀 3,010評(píng)論 1 52
  • 九月中旬的一個(gè)午后栅哀,吳長庚教授揉揉疲憊的雙眼走出自己的辦公室,從第一次進(jìn)入瀾石到現(xiàn)在已經(jīng)四十余年称龙,他走在校園里留拾,...
    若望靜海閱讀 159評(píng)論 0 0
  • 薩爾瓦多·達(dá)利(1904-1989)痴柔,西班牙畫家,超現(xiàn)實(shí)主義畫家疫向。 不瘋魔咳蔚、不成活 80后們的中學(xué)時(shí)代,流行一款叫...
    儒鏡閱讀 1,317評(píng)論 0 0