模板方法模式非常简单,就是在抽象类中对某个方法进行实现,并且将这种实现延迟到子类中(即子类中不再重写该方法)
这样,该方法就类似一个模版,对所有类型的子类对象都通用。
模板方法模式的改进:模板方法有时对不同的子类 表现可能不同,此时需要在此方法中获取子类的状态,即
在抽象类中定义一个函数,专门获取各对象的返回值,从而决定抽象类中方法的执行结果。这种方法称为”钩子“。
1 //定义悍马车类 2 class HummerModel 3 { 4 public: 5 /** 首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正 * 是要能够发动起来,那这个实现要在实现类里了 */ 6 virtual void start(); 7 //能发动,还要能停下来,那才是真本事 8 virtual void stop(); 9 //喇叭会出声音,是滴滴叫,还是哔哔叫 10 virtual void alarm(); 11 //引擎会轰隆隆的响,不响那是假的 12 virtual void engineBoom(); 13 //那模型应该会跑吧,别管是人推的,还是电力驱动,总之要会跑 14 void run() 15 { 16 //先发动汽车 17 this->start(); 18 //引擎开始轰鸣 19 this->engineBoom(); 20 //要让它叫的就是就叫,喇嘛不想让它响就不响 21 if(this->isAlarm()) 22 { 23 this->alarm(); 24 } 25 //到达目的地就停车 26 this->stop(); 27 } 28 29 //钩子方法,默认喇叭是会响的 30 bool isAlarm() 31 { 32 return true; 33 } 34 } 35 36 //定义悍马车1 37 class HummerH1Model : HummerModel 38 { 39 public: 40 bool alarmFlag = true; 41 //要响喇叭 42 void alarm() 43 { 44 System.out.println("悍马H1鸣笛..."); 45 } 46 void engineBoom() 47 { 48 System.out.println("悍马H1引擎声音是这样的..."); 49 } 50 void start() 51 { 52 System.out.println("悍马H1发动..."); 53 } 54 void stop() 55 { 56 System.out.println("悍马H1停车..."); 57 } 58 bool isAlarm() 59 { 60 return this->alarmFlag; 61 } 62 //要不要响喇叭,是由客户来决定的 63 void setAlarm(bool isAlarm) 64 { 65 this->alarmFlag = isAlarm; 66 } 67 } 68 69 //定义悍马车2 70 class HummerH1Mode2 : HummerModel 71 { 72 bool alarmFlag = true; 73 //要响喇叭 74 void alarm() 75 { 76 System.out.println("悍马H2鸣笛..."); 77 } 78 void engineBoom() 79 { 80 System.out.println("悍马H2引擎声音是这样的..."); 81 } 82 void start() 83 { 84 System.out.println("悍马H2发动..."); 85 } 86 void stop() 87 { 88 System.out.println("悍马H2停车..."); 89 } 90 bool isAlarm() 91 { 92 return this->alarmFlag; 93 } 94 //默认没有喇叭的 95 void setAlarm(bool isAlarm) 96 { 97 return false; 98 } 99 }
原文:https://www.cnblogs.com/wangyueyouyi/p/14592766.html