template pattern

[Purpose] 

有些時候你要執行的任務 : 
有幾個固定的步驟順序, 但是每個步驟執行方式是有很多選擇
比如說你開一間餐廳
服務生接待客人有固定的步驟順序,
  1.說些問候語 (您好, 歡迎光臨本店, 請問有幾位消費, ...)
  2.遞上菜單
但是有時候會客人是外國人 
​​那麼問候語和菜單也要改用英語
這個例子中, 就是兩個固定的步驟,但有兩種不同的執行的方式
用Template Pattern的好處是 :
1.固定的步驟, code寫一份就好
2.不同的執行方式需要各別寫,但能和原本的步驟自動連結上

[Implementation] 
















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()
就可以同時套用到中文, 英語, 法語 
不用改三次