《大话设计模式》c++实现 模版方法模式
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
角色:
(1)AbstractClass:是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的框架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
(2)ConcreteClass:实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
总结:当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式,把这些行为搬移到单一的地方,这样帮助子类摆脱重复的不变行为的纠缠。
1 #include<iostream> 2 #include<string> 3 4 // 实现一个模版,定义骨架。 5 class TestPaper{ 6 public: 7 void Q1(){ 8 std::cout << "杨过得到,后来给了郭靖,练成倚天剑、屠龙刀的玄铁可能是【】a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维" << std::endl; 9 std::cout << "答案:" << Answer1() << std::endl; 10 } 11 void Q2() 12 { 13 std::cout << "杨过、程英、陆无双铲除了情花,造成【】a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化" << std::endl; 14 std::cout << "答案:" << Answer2() << std::endl; 15 } 16 void Q3() 17 { 18 std::cout << "蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药【】a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们喝大量牛奶" << std::endl; 19 std::cout << "答案:" << Answer3() << std::endl; 20 } 21 protected: 22 virtual std::string Answer1(){ 23 return ""; 24 } 25 virtual std::string Answer2(){ 26 return ""; 27 } 28 virtual std::string Answer3(){ 29 return ""; 30 } 31 }; 32 //实现具体的步骤 33 class TestPaperA :public TestPaper{ 34 protected: 35 virtual std::string Answer1(){ 36 return "b"; 37 } 38 virtual std::string Answer2(){ 39 return "c"; 40 } 41 virtual std::string Answer3(){ 42 return "a"; 43 } 44 }; 45 46 class TestPaperB :public TestPaper{ 47 protected: 48 virtual std::string Answer1(){ 49 return "c"; 50 } 51 virtual std::string Answer2(){ 52 return "a"; 53 } 54 virtual std::string Answer3(){ 55 return "a"; 56 } 57 }; 58 59 void main(){ 60 std::cout << "paper of student A " << std::endl; 61 TestPaper* studentA = new TestPaperA(); 62 studentA->Q1(); 63 studentA->Q2(); 64 studentA->Q3(); 65 66 67 std::cout << "paper of student B " << std::endl; 68 TestPaper* studentB = new TestPaperB(); 69 studentB->Q1(); 70 studentB->Q2(); 71 studentB->Q3(); 72 73 delete studentA; 74 delete studentB; 75 system("pause"); 76 }
参考:
https://blog.csdn.net/xiqingnian/article/details/41989447
http://www.runoob.com/design-pattern/template-pattern.html