談談模板方法模式

老規矩,看看百科上是怎麼描述模板方法模式的:模板方法模式定義了一個算法的步驟,並允許子類別爲一個或多個步驟提供其實踐方式。讓子類別在不改變算法架構的情況下,重新定義算法中的某些步驟。

回到實際開發中,代碼寫多了,可能就會碰到這麼樣的一種情況,我們有兩個算法,兩個算法在整體上來看上差不多的,但是細節上又有一點差異。

比如泡茶和泡咖啡。

從整體上來看,就是放入原料,然後衝入開水,最後再攪拌一下,最後喝下去。

但是細節上又有一點不同,比如第一步,泡茶放的是茶葉,而泡咖啡則是導入咖啡粉。而且泡茶和泡咖啡所用的水可能也不一樣。

那麼,爲了實現完美的代碼,或者要實現代碼複用,我們應該怎麼做?

這時候,模板方法模式就派上用場了,讓我們開始擼代碼吧。

定義一個抽象類:該類有一個brew方法,裏面分別進行加入原料,加入熱水,攪拌等操作,這些操作都是抽象的,也就是還沒有被實現,需要給子類去實現。

abstract class Drink{

        void brew(){
            //放入原料
            putMaterial();
            //加入開水
            addBoliedWater();
            //攪拌
            stir();

        }

        abstract void putMaterial();

        abstract void addBoliedWater();

        abstract void stir();
    }

然後頂一個泡茶子類,繼承飲料這個類,然後實現它的方法:

class Tea extends Drink{

        @Override
        void putMaterial() {
            System.out.println("放入茶葉");
        }

        @Override
        void addBoliedWater() {
            System.out.println("加入85度的開水");
        }

        @Override
        void stir() {
            System.out.println("慢慢攪拌");
        }
    }

把關鍵步驟留給子類去實現,接下來運行一下brew這個方法

Tea tea = new Tea();
tea.brew();

運行結果:

放入茶葉
加入85度的開水
慢慢攪拌

那麼,我們也可以運用同樣的操作煮一杯咖啡:

class Coffe extends Drink{

    @Override
    void putMaterial() {
        System.out.println("加入咖啡粉");
    }

    @Override
    void addBoliedWater() {
        System.out.println("加入90度開水");
    }

    @Override
    void stir() {
        System.out.println("快速攪拌");
    }
}
Coffe coffe= new Coffe();
 coffe.brew();

運行結果:

加入咖啡粉
加入90度開水
快速攪拌
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章