模板方法模式非常简单,就是在抽象类中对某个方法进行实现,并且将这种实现延迟到子类中(即子类中不再重写该方法)
这样,该方法就类似一个模版,对所有类型的子类对象都通用。

模板方法模式的改进:模板方法有时对不同的子类 表现可能不同,此时需要在此方法中获取子类的状态,即
在抽象类中定义一个函数,专门获取各对象的返回值,从而决定抽象类中方法的执行结果。这种方法称为”钩子“。

 

 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     }

 

posted on 2021-03-29 15:54  望月又一  阅读(57)  评论(0编辑  收藏  举报