設計模式之裝飾者模式

裝飾嗎,就是本來就是一個簡單的物品,爲了滿足我們的需求或者審美,不斷地修飾,達到我們預期的要求等等。例如女生本來是素面的,天然美多好啊,但是爲了美,不斷地化妝,p圖,所以現實和我們見到的總是有差距,所以中國的四大邪術中就有很多關於中國美女的化妝術等傳說,當然了,只是開個玩笑。。。。

例如我們現在想做一道菜,招呼客人,那我們先抽象出來做飯這個事情

package com.yitian.decorate;

/**
 * @Author: yitianRen
 * @Description: 做飯
 * @Date: 11:14 2019/9/19
 * @Param:
 * @Return:
*/
public interface Cook {

    public void cook();

}

例如我想吃辣子雞了【口水直流(。◕ˇ∀ˇ◕)】,那我們先得有個雞🐓。

package com.yitian.decorate;

/**
 * @Description TODO
 * @Author yitianRen
 * @Date 2019/9/19 11:14
 * @Version 1.0
 **/
public class PepperyChicken implements Cook {
    @Override
    public void cook() {
        System.out.print("小公雞");
    }
}

光有雞就可以了?生吃?那怎麼行吶,來讓我們用蔥薑辣椒🌶爆炒一下🤺,同樣實現了Cook接口。

package com.yitian.decorate;

/**
 * @Description 裝飾着爆炒公雞
 * @Author yitianRen
 * @Date 2019/9/19 11:15
 * @Version 1.0
 **/
public class Decorate implements Cook {

    Cook cook;

    public Decorate(Cook cook) {
        this.cook = cook;
    }

    @Override
    public void cook() {
        System.out.print("蔥薑辣椒爆炒(");//蔥姜爆炒
        cook.cook();//小公雞
        System.out.print(")");//收工
    }
}

初具小成得辣子雞已經有了,讓我看一下:

package com.yitian.decorate;

/**
 * @Description TODO
 * @Author yitianRen
 * @Date 2019/9/19 11:19
 * @Version 1.0
 **/
public class DecorateMain {

    public static void main(String[] args) {
        new Decorate(new PepperyChicken()).cook();
        /*
            蔥薑辣椒爆炒(小公雞)
            Process finished with exit code 0

            */
    }

}

哎呀怎麼一點味道都沒有呢???鹽呢  調料呢?好吧,我們還要繼續調整裝飾,但是都有一個共同點就是都可以對雞進行操作,那我們把操作抽取,按照工序一道一道來-》

把裝飾抽出來,做一個抽象類,不做任何事情,爆炒啊或者調料都由子類操作:

package com.yitian.decorate;

/**
 * @Description 裝飾着爆炒公雞
 * @Author yitianRen
 * @Date 2019/9/19 11:15
 * @Version 1.0
 **/
public abstract class Decorate implements Cook {

    Cook cook;

    public Decorate(Cook cook) {
        this.cook = cook;
    }

    @Override
    public void cook() {
        cook.cook();//不做任何事情
    }
}

建一個蔥薑蒜:

package com.yitian.decorate;

/**
 * @Description TODO
 * @Author yitianRen
 * @Date 2019/9/19 13:55
 * @Version 1.0
 **/
public class GreenOnion extends Decorate {

    public GreenOnion(Cook cook) {
        super(cook);
    }

    public void cook() {
        System.out.print("蔥薑辣椒爆炒(");//蔥姜爆炒
        cook.cook();//小公雞
        System.out.print(")");
    }
}

建一個調料:

package com.yitian.decorate;

/**
 * @Description TODO
 * @Author yitianRen
 * @Date 2019/9/19 14:06
 * @Version 1.0
 **/
public class Flavour extends Decorate {

    public Flavour(Cook cook) {
        super(cook);
    }

    public void cook() {
        System.out.print("加入調料入味(");//調料
        cook.cook();//小公雞
        System.out.print(")");
    }
}

來吧讓我們做一道熱氣騰騰得小公雞吧:

package com.yitian.decorate;

/**
 * @Description TODO
 * @Author yitianRen
 * @Date 2019/9/19 11:19
 * @Version 1.0
 **/
public class DecorateMain {

    public static void main(String[] args) {
        Cook cook=new Flavour(new GreenOnion(new PepperyChicken()));
        cook.cook();
        /* 輸出
            加入調料入味(蔥薑辣椒爆炒(小公雞))
            Process finished with exit code 0
        */
    }

}

如果還不滿意我們可以再加入更多工序。

我們觀察這種裝飾器模式結構,是不是似曾相識呢?沒錯,其實裝飾器模式在JDK裏就有很多應用,比如Java IO包裏的衆多流處理類。

new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));

當然,流處理類當然要比我們的例子複雜的多,但其基本思想和我們去繁就簡的例子異途同歸,這些對象就好像是俄羅斯套娃一樣層層包裹,層層裝飾,每套一層就會多出一些功能出來,我們更可以自由搭配,實現不同的組合功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章