設(shè)計模式之Wrapper

這個模式其實(shí)是Adapter模式和Decorator模式的統(tǒng)稱脑又。

1. 范例

Servlet規(guī)范中的javax.servlet.http.HttpServletRequestWrapper就是這種模式的經(jīng)典例子倔矾。

  1. HttpServletRequestWrapper繼承自ServletRequestWrapper, 同時實(shí)現(xiàn)了HttpServletRequest旅敷。
  2. ServletRequestWrapper則是實(shí)現(xiàn)了ServletRequest接口瞎惫。
  3. 注意HttpServletRequestWrapperServletRequestWrapper都不是abstract, 所以是可以直接拿來用的。 不過我們一般是繼承自它榆骚,然后覆寫我們所關(guān)注的方法蕉汪。

2. 分析

  1. 因?yàn)檫@些wrapper可以互相嵌套, 最終造就一個千層餅樣式的對象封字。每一層都是ServletRequest類型黔州, 但每層只處理特定的一個需求, 這樣就將一個瑞士軍刀類里的功能分散了出去阔籽。

  2. 每層餅增強(qiáng)原來瑞士軍刀類的一部分功能流妻, 這樣就會將原來的瑞士軍刀類的功能集拆分為一個個非常小的功能塊, 每個功能小塊只專注特定的一部分仿耽。 如果劃分得好的話合冀, 相當(dāng)于將瑞士軍刀類進(jìn)行了邏輯切割。類的數(shù)量增多, 但代碼量減小项贺,便于維護(hù)和升級。

  3. 而且Wrapper模式下峭判,對于同一個方法开缎,各個Wrapper實(shí)例的包裝順序和其執(zhí)行順序是正好相反的

3. 代碼講解

// All -- 瑞士軍刀類
public class All {
    public void a(){
        System.out.println("a");
    }
    
    public void b(){
        System.out.println("b");
    }
    
    public void c(){
        System.out.println("c");
    }

    public void X(){
        System.out.println("ALL - X");
    }
}

// Wrapper模式
public abstract class AllWrapper extends All {
    private All under;

    protected AllWrapper(All all) {
        under = all;
    }

    @Override
    public void a() {
        under.a();
    }

    @Override
    public void b() {
        under.b();
    }

    @Override
    public void c() {
        under.c();
    }

    @Override
    public void X() {
        under.X();
    }
}

// ----------------- 以下的 A, B, C只關(guān)注于某個方法林螃。
// 專注于 a 功能塊的處理
public class A extends AllWrapper {

    protected A(All all) {
        super(all);
    }

    @Override
    public void a() {
        System.out.println("A - a");
    }

    @Override
    public void X() {
        System.out.println("A - X");
        super.X();
    }
}

// 專注于 b 功能塊的處理
public class B extends AllWrapper {

    protected B(All all) {
        super(all);
    }

    @Override
    public void b() {
        System.out.println("B - b");
    }

    @Override
    public void X() {
        System.out.println("B - X");
        super.X();
    }
}

// 專注于 c 功能塊的處理
public class C extends AllWrapper {

    protected C(All all) {
        super(all);
    }

    @Override
    public void c() {
        System.out.println("C - c");
    }

    @Override
    public void X() {
        System.out.println("C - X");
        super.X();
    }
}

// 單元測試
public class DesignPattern_Wrapper_Tests {
    @Test
    public void testname() throws Exception {
        All all = new All();
        // a
        // b
        // c
        all.a();
        all.b();
        all.c();

        all = new A(all);
        all = new B(all);
        all = new C(all);

        // A - a
        // B - b
        // C - c    
        // 可以嘗試注釋掉上面的某一行代碼, 查看輸出結(jié)果  
        all.a();
        all.b();
        all.c();

        // ----- 和上面的注入順序正好相反
        // C - X
        // B - X
        // A - X
        // ALL - X
        all.X();        
    }

}

4. 總結(jié)

這種文章本來應(yīng)該是入行一兩年的時候就寫下的奕删。之所以推遲到了現(xiàn)在,一言難盡啦疗认!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末完残,一起剝皮案震驚了整個濱河市伏钠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谨设,老刑警劉巖熟掂,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扎拣,居然都是意外死亡赴肚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門二蓝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉券,“玉大人,你說我怎么就攤上這事刊愚∮桓” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵鸥诽,是天一觀的道長商玫。 經(jīng)常有香客問我,道長衙传,這世上最難降的妖魔是什么决帖? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蓖捶,結(jié)果婚禮上地回,老公的妹妹穿的比我還像新娘。我一直安慰自己俊鱼,他們只是感情好刻像,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著并闲,像睡著了一般细睡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帝火,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天溜徙,我揣著相機(jī)與錄音,去河邊找鬼犀填。 笑死蠢壹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的九巡。 我是一名探鬼主播图贸,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疏日?” 一聲冷哼從身側(cè)響起偿洁,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沟优,沒想到半個月后涕滋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡净神,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年何吝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹃唯。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡爱榕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坡慌,到底是詐尸還是另有隱情黔酥,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布洪橘,位于F島的核電站跪者,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏熄求。R本人自食惡果不足惜渣玲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弟晚。 院中可真熱鬧忘衍,春花似錦、人聲如沸卿城。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑟押。三九已至搀捷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間多望,已是汗流浹背嫩舟。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怀偷,地道東北人至壤。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像枢纠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

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

  • 從三月份找實(shí)習(xí)到現(xiàn)在晋渺,面了一些公司,掛了不少,但最終還是拿到小米香椎、百度找筝、阿里、京東八千、新浪吗讶、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,248評論 11 349
  • Servlet Interface 是Java Servlet API的核心抽象恋捆。所有的servlets都直接或者...
    Lucky_Micky閱讀 1,697評論 2 2
  • 0 系列目錄# WEB請求處理 WEB請求處理一:瀏覽器請求發(fā)起處理 WEB請求處理二:Nginx請求反向代理 本...
    七寸知架構(gòu)閱讀 13,962評論 22 190
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法照皆,類相關(guān)的語法,內(nèi)部類的語法沸停,繼承相關(guān)的語法膜毁,異常的語法,線程的語...
    子非魚_t_閱讀 31,632評論 18 399
  • 無論形式如何娛樂,奇葩說的實(shí)質(zhì)還是辯論里面最專業(yè)的東西能颁。就是邏輯辯論杂瘸。每一季奇葩之王都是辯論咖。從馬薇薇到邱晨到黃...
    慧讀繪本閱讀 750評論 0 0