設(shè)計(jì)模式第七篇-結(jié)構(gòu)型模式【代理模式】

設(shè)計(jì)模式案例分析-github

一瓤狐、什么是代理模式?

? ? 定義: 為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)弯囊,重點(diǎn)在控制以及擴(kuò)展已有類(lèi)的功能

? ?通俗理解:? 就是一個(gè)中介潘明,通過(guò)該對(duì)象來(lái)訪問(wèn)另外一個(gè)對(duì)象

? ? 編程思想:?不要隨意去修改別人已經(jīng)寫(xiě)好的代碼或者方法,如果需改修改,可以通過(guò)代理的方式來(lái)擴(kuò)展? ? ? ? ? ? ? ? ? ? ? ?該方法

? ? ?案例理解:? 假設(shè)我們想邀請(qǐng)一位明星,那么并不是直接連接明星,而是聯(lián)系明星的經(jīng)紀(jì)人,來(lái)達(dá)到同樣的目的.明星就是一個(gè)目標(biāo)對(duì)象,他只要負(fù)責(zé)活動(dòng)中的節(jié)目,而其他瑣碎的事情就交給他的代理人(經(jīng)紀(jì)人)來(lái)解決蛋欣。

? ?代理模式理解重點(diǎn):代理對(duì)象與目標(biāo)對(duì)象.代理對(duì)象是對(duì)目標(biāo)對(duì)象的擴(kuò)展,并會(huì)調(diào)用目標(biāo)對(duì)象

二寡夹、代理模式種類(lèi)?

? ??代理模式分為 靜態(tài)代理模式处面,動(dòng)態(tài)代理模式, cglib代理,以下分別說(shuō)明這三種代理模式菩掏。

三魂角、靜態(tài)代理模式?

? ? ?特點(diǎn): 需要定義接口或者父類(lèi),被代理對(duì)象與代理對(duì)象一起實(shí)現(xiàn)相同的接口或者是繼承相同父類(lèi).

? ? ?角色?

? ? ?????目標(biāo)接口: 定義需要代理的對(duì)象接口

? ? ?????目標(biāo)對(duì)象: 定義需要代理的對(duì)象智绸,實(shí)現(xiàn)目標(biāo)接口

? ? ?????代理對(duì)象: 定義代理對(duì)象野揪,實(shí)現(xiàn)目標(biāo)接口,持有目標(biāo)對(duì)象引用

? ? ?分析??

? ? ? ? ? ? 優(yōu)點(diǎn):? ?可以做到在不修改目標(biāo)對(duì)象的功能前提下, 使用代理對(duì)象實(shí)現(xiàn)對(duì)目標(biāo)功能擴(kuò)展.

? ? ? ? ? ? 缺點(diǎn):? 因?yàn)榇韺?duì)象需要與目標(biāo)對(duì)象實(shí)現(xiàn)一樣的接口,所以會(huì)有很多代理類(lèi),類(lèi)太多.同時(shí)如果對(duì)目標(biāo)對(duì)象執(zhí)行方法前后的操作都一樣瞧栗,每個(gè)方法中存在前后執(zhí)行代碼的冗余代碼斯稳。一旦接口增 加方法,目標(biāo)對(duì)象與代理對(duì)象都要維護(hù).

? ? 如何解決靜態(tài)代理中的缺點(diǎn)呢?

? ? ? ? ? 答案是可以使用動(dòng)態(tài)代理方式

四、動(dòng)態(tài)代理模式迹恐???

由來(lái): 解決使用靜態(tài)代理造成代理類(lèi)太多挣惰,當(dāng)接口修改目標(biāo)與代理對(duì)象都要維護(hù)。

特點(diǎn):? 1.代理對(duì)象,不需要實(shí)現(xiàn)接口

? ? ? ? ? 2.代理對(duì)象的生成,是利用JDK的API, 動(dòng)態(tài)的在內(nèi)存中構(gòu)建代理對(duì)象(需要我們指定創(chuàng)建代理對(duì)象/

? ? ? ? ? ? ?目標(biāo)對(duì)象實(shí)現(xiàn)的接口的類(lèi)型)

? ? ? ? ? 3. 動(dòng)態(tài)代理也叫做:JDK代理,接口代理

? ? ? ? ? 4.?代理對(duì)象不需要實(shí)現(xiàn)接口,但是目標(biāo)對(duì)象一定要實(shí)現(xiàn)接口,否則不能用動(dòng)態(tài)代理

使用:?JDK中生成代理對(duì)象的API

代理類(lèi)所在包:java.lang.reflect.Proxy

JDK實(shí)現(xiàn)代理只需要使用newProxyInstance方法,但是該方法需要接收三個(gè)參數(shù),完整的寫(xiě)法是:

static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h )

注意該方法是在Proxy類(lèi)中是靜態(tài)方法,且接收的三個(gè)參數(shù)依次為:

ClassLoader loader,:指定當(dāng)前目標(biāo)對(duì)象使用類(lèi)加載器,獲取加載器的方法是固定的

Class[] interfaces,:目標(biāo)對(duì)象實(shí)現(xiàn)的接口的類(lèi)型,使用泛型方式確認(rèn)類(lèi)型

InvocationHandler h:事件處理,執(zhí)行目標(biāo)對(duì)象的方法時(shí),會(huì)觸發(fā)事件處理器的方法,會(huì)把當(dāng)前執(zhí)行目標(biāo)對(duì)象的方法作為參數(shù)傳入

五系草、Cglib代理

? ? 問(wèn)題通熄? 如果一個(gè)類(lèi)沒(méi)有實(shí)現(xiàn)接口,那怎么為這個(gè)類(lèi)創(chuàng)建代理對(duì)象呢找都?這時(shí)候就需要使用到Cglib代理了唇辨。

? ?特點(diǎn): 目標(biāo)對(duì)象不需要實(shí)現(xiàn)接口

? ?使用: 1、下載Cglib jar包

? ? ? ? ? ? ? 2能耻、給目標(biāo)對(duì)象創(chuàng)建代理對(duì)象

????????public class ProxyFactoryimplements MethodInterceptor {

????????????private Objecttarget;

? ? ????????public ProxyFactory(Object target) {

????????????????this.target = target;

????????? ? }

????????// 使用cglib給目標(biāo)對(duì)象創(chuàng)建代理對(duì)象

? ? ? ? ? ?public ObjectgetProxyInstance() {

????????????????// 1赏枚、創(chuàng)建工具類(lèi)

? ? ? ????????? Enhancer enhancer =new Enhancer();

? ? ? ? ? ? ? ?// 2、設(shè)置父類(lèi)

? ? ? ? ????????enhancer.setSuperclass(target.getClass());

? ? ? ????????? // 3晓猛、設(shè)置回調(diào)

? ? ? ????????? enhancer.setCallback(this);

? ? ? ????????? // 4饿幅、創(chuàng)建子類(lèi)

? ? ? ????????? return enhancer.create();

? ????????? }

????????@Override

? ????? public Objectintercept(Object o, Method method, Object[] objects, MethodProxy ????????????methodProxy)throws Throwable {

????????????android.util.Log.i("zqr", "on pre save user");

? ? ? ????? Object object = method.invoke(target, objects);

? ? ? ????? android.util.Log.i("zqr", "on After save user");

? ? ? ? return object;

? ? }

}

三、代理模式與適配器模式戒职,裝飾者模式區(qū)別?

???1栗恩、和適配器模式的區(qū)別:適配器模式主要改變所考慮對(duì)象的接口,而代理模式不能改變所代理類(lèi)的接口洪燥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末磕秤,一起剝皮案震驚了整個(gè)濱河市乳乌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌市咆,老刑警劉巖汉操,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蒙兰,居然都是意外死亡磷瘤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)搜变,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)采缚,“玉大人,你說(shuō)我怎么就攤上這事挠他⊙龅#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵绩社,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我赂苗,道長(zhǎng)愉耙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任拌滋,我火速辦了婚禮朴沿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘败砂。我一直安慰自己赌渣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布昌犹。 她就那樣靜靜地躺著坚芜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斜姥。 梳的紋絲不亂的頭發(fā)上鸿竖,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音铸敏,去河邊找鬼缚忧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杈笔,可吹牛的內(nèi)容都是我干的闪水。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蒙具,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼球榆!你這毒婦竟也來(lái)了朽肥?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芜果,失蹤者是張志新(化名)和其女友劉穎鞠呈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體右钾,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚁吝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舀射。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窘茁。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脆烟,靈堂內(nèi)的尸體忽然破棺而出山林,到底是詐尸還是另有隱情,我是刑警寧澤邢羔,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布驼抹,位于F島的核電站,受9級(jí)特大地震影響拜鹤,放射性物質(zhì)發(fā)生泄漏框冀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一敏簿、第九天 我趴在偏房一處隱蔽的房頂上張望明也。 院中可真熱鬧,春花似錦惯裕、人聲如沸温数。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撑刺。三九已至,卻和暖如春咙边,著一層夾襖步出監(jiān)牢的瞬間猜煮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工败许, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留王带,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓市殷,卻偏偏與公主長(zhǎng)得像愕撰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 參考資料:菜鳥(niǎo)教程之設(shè)計(jì)模式 設(shè)計(jì)模式概述 設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐搞挣,通常被有經(jīng)驗(yàn)...
    Steven1997閱讀 1,174評(píng)論 1 12
  • 前言:設(shè)計(jì)模式之結(jié)構(gòu)型模式軟件模式與具體的應(yīng)用領(lǐng)域無(wú)關(guān),也就是說(shuō)無(wú)論你從事的是移動(dòng)應(yīng)用開(kāi)發(fā)带迟、桌面應(yīng)用開(kāi)發(fā)、Web ...
    markfork閱讀 2,453評(píng)論 4 13
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理囱桨,服務(wù)發(fā)現(xiàn)仓犬,斷路器,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 第一種方法:請(qǐng)求成交法舍肠,也叫直接發(fā)問(wèn)法搀继。用簡(jiǎn)單明了的語(yǔ)言,直截了當(dāng)?shù)叵蝾櫩吞岢龀山灰蟮囊环N方法翠语。采用這種方法叽躯,推...
    狼者傳媒Mar閱讀 4,546評(píng)論 0 1
  • 愛(ài)情可以讓人醉生夢(mèng)死,大多數(shù)人都是這樣的肌括。 然而点骑,當(dāng)我每每意識(shí)到這所謂的愛(ài)情,只不過(guò)是我展現(xiàn)我的生存價(jià)值谍夭,你展現(xiàn)你...
    野生數(shù)學(xué)家閱讀 473評(píng)論 0 2