結(jié)構(gòu)型模式--代理模式&&適配器模式&&裝飾器模式

算是讀書筆記吧

極客時間--設(shè)計模式之美


代理模式和裝飾器模式的在實現(xiàn)上相同蹦玫,所以放在一起看撮胧。

以代理模式為例

// 代理模式的代碼結(jié)構(gòu)(下面的接口也可以替換成抽象類)
public interface IA {
  void f();
}
public class A impelements IA {
  public void f() { //... }
}
public class AProxy impements IA {
  private IA a;
  public AProxy(IA a) {
    this.a = a;
  }
  
  public void f() {
    // 新添加的代理邏輯
    a.f();
    // 新添加的代理邏輯
  }
}

private void demo() {
  IA a = AProxy(A.new())
  a.f()
}

二者的相似性

  • 目的上

主要解決繼承關(guān)系過于復雜的問題赡突,借助面向接口的編程思想午绳,通過組合來替代繼承癌佩。

  • 實現(xiàn)上

在不改變原始類(或叫被代理類)代碼的情況下碌嘀,由新的類和原始類需要實現(xiàn)相同的接口。


二者的區(qū)別性

二者的區(qū)別體現(xiàn)在想要對原始類附加的功能

代理模式

將功能直接轉(zhuǎn)交給代理類進行實現(xiàn)傍念。

偏重業(yè)務無關(guān)矫夷,高度抽象,和穩(wěn)定性較高的場景憋槐。
由原始類指定代理類双藕,對業(yè)務方隱藏代理類的存在。

比如對數(shù)據(jù)訪問功能添加日志阳仔,緩存忧陪。

裝飾器模式

給原始類添加增強功能。

偏重業(yè)務相關(guān)驳概,定制化訴求高赤嚼,改動較頻繁的場景。
由業(yè)務方指定裝飾類顺又,依賴業(yè)務方的具體實現(xiàn)更卒。

比如業(yè)務級別上對日志增加字段、數(shù)據(jù)的加工整理稚照。

代理模式主要目的是控制訪問蹂空,而非加強功能。這是它跟裝飾器模式最大的不同


適配器模式

適配器模式與代理和裝飾器模式一樣果录,也是基于面向接口編程的特性上枕,通過接口對不同的類進行統(tǒng)一約束。

這里的統(tǒng)一弱恒,體現(xiàn)在:

  • 不同類的調(diào)用方式統(tǒng)一辨萍,更好的利用多態(tài)特性

// 使用適配器模式進行改造
public interface ISensitiveWordsFilter { // 統(tǒng)一接口定義
  String filter(String text);
}

// 擴展性更好,更加符合開閉原則返弹,如果添加一個新的敏感詞過濾系統(tǒng)锈玉,
// 這個類完全不需要改動;而且基于接口而非實現(xiàn)編程义起,代碼的可測試性更好拉背。
public class RiskManagement { 
  private List<ISensitiveWordsFilter> filters = new ArrayList<>();
 
  public void addSensitiveWordsFilter(ISensitiveWordsFilter filter) {
    filters.add(filter);
  }
  
  public String filterSensitiveWords(String text) {
    String maskedText = text;
    for (ISensitiveWordsFilter filter : filters) {  //這里每個filter的filter方法內(nèi)部,包裹著真實實現(xiàn)
      maskedText = filter.filter(maskedText);
    }
    return maskedText;
  }
}

當然默终,也有為了版本兼容而使用的適配器模式椅棺。將適配器實現(xiàn)的細節(jié)犁罩,轉(zhuǎn)接給另一個類進行實現(xiàn)

/**
 * Returns an enumeration over the specified collection.  This provides
 * interoperability with legacy APIs that require an enumeration
 * as input.
 *
 * @param  <T> the class of the objects in the collection
 * @param c the collection for which an enumeration is to be returned.
 * @return an enumeration over the specified collection.
 * @see Enumeration
 */
public static <T> Enumeration<T> enumeration(final Collection<T> c) {
  return new Enumeration<T>() {
    private final Iterator<T> i = c.iterator();

    public boolean hasMoreElements() {
      return i.hasNext();
    }

    public T nextElement() {
      return i.next();
    }
  };
}

適配器模式是用來做適配,它將不兼容的接口轉(zhuǎn)換為可兼容的接口两疚,讓原本由于接口不兼容而不能一起工作的類可以一起工作床估。適配器模式有兩種實現(xiàn)方式:類適配器和對象適配器。其中鬼雀,類適配器使用繼承關(guān)系來實現(xiàn)顷窒,對象適配器使用組合關(guān)系來實現(xiàn)。
一般來說源哩,適配器模式可以看作一種“補償模式”,用來補救設(shè)計上的缺陷鸦做。應用這種模式算是“無奈之舉”励烦,如果在設(shè)計初期,我們就能協(xié)調(diào)規(guī)避接口不兼容的問題泼诱,那這種模式就沒有應用的機會了坛掠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市治筒,隨后出現(xiàn)的幾起案子屉栓,更是在濱河造成了極大的恐慌,老刑警劉巖耸袜,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件友多,死亡現(xiàn)場離奇詭異,居然都是意外死亡堤框,警方通過查閱死者的電腦和手機域滥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜈抓,“玉大人启绰,你說我怎么就攤上這事」凳梗” “怎么了委可?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腊嗡。 經(jīng)常有香客問我着倾,道長,這世上最難降的妖魔是什么叽唱? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任屈呕,我火速辦了婚禮,結(jié)果婚禮上棺亭,老公的妹妹穿的比我還像新娘虎眨。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布嗽桩。 她就那樣靜靜地躺著岳守,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碌冶。 梳的紋絲不亂的頭發(fā)上湿痢,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音扑庞,去河邊找鬼譬重。 笑死,一個胖子當著我的面吹牛罐氨,可吹牛的內(nèi)容都是我干的臀规。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼栅隐,長吁一口氣:“原來是場噩夢啊……” “哼塔嬉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起租悄,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤谨究,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泣棋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胶哲,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年外傅,在試婚紗的時候發(fā)現(xiàn)自己被綠了纪吮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡萎胰,死狀恐怖碾盟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情技竟,我是刑警寧澤冰肴,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站榔组,受9級特大地震影響熙尉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搓扯,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一检痰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锨推,春花似錦铅歼、人聲如沸公壤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厦幅。三九已至,卻和暖如春慨飘,著一層夾襖步出監(jiān)牢的瞬間确憨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工瓤的, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留休弃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓堤瘤,卻偏偏與公主長得像玫芦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子本辐,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353