close

樣板方法模式:將一個演算法的骨架定義在一個方法中,而其中的某些方法定義在次類別中,樣板方法讓次類別可以在不改變演算法架構的情況下,重新定義演算法中的某些步驟。

我們用泡茶和咖啡來解釋樣板方法模式,假設我們有以下兩個類別Coffee和Tea,我們可以看出兩個類別提供的方法,有很多類似的地方。

 

class Coffee{
public:
    void prepareRecipe(){
        boilWater();
        brewCoffeeGrinds();
        pourInCup();
    }
    void boilWater(){ cout << "煮開水" << endl; }
    void brewCoffeeGrinds(){ cout << "煮咖啡" << endl; }
    void pourInCup(){ cout << "倒入杯中" << endl; }
};

class Tea{
public:
    void prepareRecipe(){
        boilWater();
        steepTeaBag();
        pourInCup();
    }
    void boilWater(){ cout << "煮開水" << endl; }
    void steepTeaBag(){ cout << "泡茶" << endl; }
    void pourInCup(){ cout << "倒入杯中" << endl; }
};

 

這時我們可以用樣板方法模式,創造一個Beverage類別,將Coffee和Tea類別相同的地方,抽取到Beverage類別內。 ​​​​​​​

 

 

#include <iostream>
using namespace std;

class Beverage{
public:
    void prepareRecipe(){
        boilWater();
        brew();
        pourInCup();
    }
    void boilWater(){ cout << "煮開水" << endl; }
    virtual void brew() = 0;
    void pourInCup(){ cout << "倒入杯中" << endl; }
};
class Coffee : public Beverage{
public:
    void brew(){ cout << "煮咖啡" << endl; }
};

class Tea : public Beverage{
public:
    void brew(){ cout << "泡茶" << endl; }
};

int main(){
    Coffee myCoffee;
    Tea myTea;
    myCoffee.prepareRecipe();
    myTea.prepareRecipe();

    return 0;
}
​​​​​​​

 

 

 

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Eric 的頭像
    Eric

    一個小小工程師的心情抒發天地

    Eric 發表在 痞客邦 留言(0) 人氣()