有些時候你要執行的任務 :
有幾個固定的步驟順序, 但是每個步驟執行方式是有很多選擇
比如說你開一間餐廳
服務生接待客人有固定的步驟順序,
1.說些問候語 (您好, 歡迎光臨本店, 請問有幾位消費, ...)
2.遞上菜單
但是有時候會客人是外國人
那麼問候語和菜單也要改用英語
這個例子中, 就是兩個固定的步驟,但有兩種不同的執行的方式
用Template Pattern的好處是 :
1.固定的步驟, code寫一份就好
2.不同的執行方式需要各別寫,但能和原本的步驟自動連結上
class AbstractClass{
public:
void executeSteps(){
step1();
step2();
}
virtual void step1() = 0;
virtual void step2() = 0;
};
class Concrete1: public AbstractClass{
public :
void step1(){
cout << "您好" << endl;
}
void step2(){
cout << "遞上中文菜單" << endl;
}
};
class Concrete2: public AbstractClass{
public :
void step1(){
cout << "hello" << endl;
}
void step2(){
cout << "present english menu" << endl;
}
};
int main(int argc, char** argv) {
AbstractClass* chinese = new Concrete1();
AbstractClass* english = new Concrete2();
chinese->executeSteps();
english->executeSteps();
return 0;
}
用Template Pattern的好處是:
1.今天你想支援法語的功能, 只要多寫一個Concrete Class3即可
這滿足了Open for extension
2.今天你新增法語功能的時候, 不會動到Concrete Class1/2與Abstract Class
這滿足了Close for modification
3.今天你想顛倒步驟順序, 改為先上菜單再說歡迎, 你只要改executeSteps()
就可以同時套用到中文, 英語, 法語
不用改三次