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

創(chuàng)建一個(gè)新的對(duì)象躲因,將原對(duì)象作為新對(duì)象的屬性。使用原對(duì)象的地方忌傻,自動(dòng)轉(zhuǎn)為使用新對(duì)象大脉,同樣的功能方法,新對(duì)象可選擇增強(qiáng)原對(duì)象的功能水孩,也可選擇重新實(shí)現(xiàn)原對(duì)象的功能

為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問镰矿。

  • 適配器:使用B接口(港版電腦),不能直接對(duì)接A接口(墻上的電插頭)俘种,這時(shí)候需要加一個(gè)B到A的適配器(轉(zhuǎn)換頭)秤标。
public BAdapter implements/extends B {
    private A a;
    public BAdapter(A a) {
        this.a = a;
    }
    public void b() {  // 名稱為外部的接口名稱绝淡,內(nèi)部轉(zhuǎn)換為,實(shí)際的接口
        a.a();
    }
}
  • 代理:為原對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問苍姜。原對(duì)象和代理對(duì)象都實(shí)現(xiàn)同一接口牢酵。

對(duì)于外部調(diào)用者來說只關(guān)心調(diào)用操作是否被執(zhí)行,而不會(huì)關(guān)心本次調(diào)用是被直接執(zhí)行的還是被代理者間接執(zhí)行的衙猪。所以馍乙,aop中,獲取進(jìn)行了aop功能增強(qiáng)的類垫释,是通過接口獲人扛瘛(不能通過具體類名獲取,ioc容器里面沒有原來實(shí)現(xiàn)類的bean棵譬,只有代理類的bean)铁追,Spring自動(dòng)轉(zhuǎn)換為調(diào)用代理類

public AProxy implements/extends A {
    private A a;
    public AProxy(A a) {
        this.a = a;
    }
    public void a() {  // 只做功能增強(qiáng)茫船,接口名稱和主要功能不變
        this.a.a();
    }
}

這里最重要的就是:代理類持有被代理類的一個(gè)實(shí)例琅束,無論代理類是繼承還是接口實(shí)現(xiàn)

image.png

image.png

  • 裝飾器:把核心功能和附加功能給分開了。裝飾器類和原實(shí)現(xiàn)類算谈,都實(shí)現(xiàn)的同一接口 / 繼承自同一個(gè)類涩禀。裝飾器不但實(shí)現(xiàn)原抽象接口,還聚合了原抽象接口(即持有一個(gè)原抽象接口的具體實(shí)現(xiàn))然眼。半透明的裝飾器約等于適配器艾船。手抓餅加雞蛋加生菜加培根
    image.png

Decorator模式讓調(diào)用者自己創(chuàng)建核心類高每,然后組合各種功能屿岂。Proxy模式?jīng)Q不能讓調(diào)用者自己創(chuàng)建再組合,否則就失去了代理的功能鲸匿。Proxy模式讓調(diào)用者認(rèn)為獲取到的是核心類接口爷怀,但實(shí)際上是代理類

問題

class UserService {
  @AutoWired
  OrderService orderService;

  public void test() {
    log.info("哈哈哈哈哈");
    log.info("orderService: {}", orderService);
  };
}
  • 通過aop生成的UserService代理對(duì)象的orderService屬性是不是null?

是的带欢。原因是代理對(duì)象是一個(gè)新的對(duì)象运授,和原來的被代理的UserService不是同一個(gè)對(duì)象,這個(gè)代理對(duì)象沒有經(jīng)過依賴注入乔煞,所以orderService屬性是null

  • 調(diào)用UserService代理對(duì)象的test方法吁朦,打印的orderService是不是null

不是。代理對(duì)象持有target的是一個(gè)spring的bean渡贾,是通過依賴注入的bean逗宜。所以說代理模式,最重要的是:代理類持有被代理類的一個(gè)實(shí)例,無論代理類是繼承還是接口實(shí)現(xiàn)

class UserServiceProxy extends  UserService {
  
  UserService target;

  public void test() {
    // aop增強(qiáng)邏輯:從切點(diǎn)緩存中獲取
    target.test();
  };
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纺讲,一起剝皮案震驚了整個(gè)濱河市擂仍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刻诊,老刑警劉巖防楷,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牺丙,死亡現(xiàn)場離奇詭異则涯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冲簿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門粟判,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峦剔,你說我怎么就攤上這事档礁。” “怎么了吝沫?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵呻澜,是天一觀的道長。 經(jīng)常有香客問我惨险,道長羹幸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任辫愉,我火速辦了婚禮栅受,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恭朗。我一直安慰自己屏镊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布痰腮。 她就那樣靜靜地躺著而芥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膀值。 梳的紋絲不亂的頭發(fā)上蔚出,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音虫腋,去河邊找鬼骄酗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悦冀,可吹牛的內(nèi)容都是我干的趋翻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼盒蟆,長吁一口氣:“原來是場噩夢啊……” “哼踏烙!你這毒婦竟也來了师骗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤讨惩,失蹤者是張志新(化名)和其女友劉穎辟癌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荐捻,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黍少,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了处面。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厂置。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖魂角,靈堂內(nèi)的尸體忽然破棺而出昵济,到底是詐尸還是另有隱情,我是刑警寧澤野揪,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布访忿,位于F島的核電站,受9級(jí)特大地震影響斯稳,放射性物質(zhì)發(fā)生泄漏海铆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一平挑、第九天 我趴在偏房一處隱蔽的房頂上張望游添。 院中可真熱鬧,春花似錦通熄、人聲如沸唆涝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廊酣。三九已至,卻和暖如春赏枚,著一層夾襖步出監(jiān)牢的瞬間亡驰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工饿幅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凡辱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓栗恩,卻偏偏與公主長得像透乾,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 引言 我們都知道乳乌,數(shù)據(jù)庫連接是很珍貴的資源捧韵,頻繁的開關(guān)數(shù)據(jù)庫連接是非常浪費(fèi)服務(wù)器的CPU資源以及內(nèi)存的,所以我們一...
    小波同學(xué)閱讀 355評(píng)論 0 1
  • 原文連接 簡介 Java編程的目標(biāo)是實(shí)現(xiàn)現(xiàn)實(shí)不能完成的汉操,優(yōu)化現(xiàn)實(shí)能夠完成的再来,是一種虛擬技術(shù)。生活中的方方面面都可以...
    zjk_00閱讀 348評(píng)論 0 0
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是代理模式 模式的結(jié)構(gòu) 典型代碼 代理模式分類 代碼示例 代理模式和裝飾者模式的...
    w1992wishes閱讀 1,543評(píng)論 0 13
  • 所謂代理就通過引用一個(gè)新的對(duì)象來實(shí)現(xiàn)對(duì)真實(shí)對(duì)象的操作或者將新的對(duì)象當(dāng)做真實(shí)對(duì)象的一個(gè)替身磷瘤,這種實(shí)現(xiàn)的機(jī)制就是代理模...
    這一刻_776b閱讀 204評(píng)論 0 0
  • 代理模式是一種通過中間代理訪問目標(biāo)對(duì)象芒篷,以達(dá)到增強(qiáng)或拓展原對(duì)象功能目的的設(shè)計(jì)模式,舉個(gè)例子來說膀斋,我們?cè)谫徺I飛機(jī)票時(shí)...
    _南軒閱讀 494評(píng)論 0 0