template method(模板方法)

一.引入

 

 

 

 二.template method(模板方法)

代码示例:

一开始的代码:

template1_app.cpp:

 1 //应用程序开发人员
 2 class Application{
 3 public:
 4     bool Step2(){
 5         //...
 6     }
 7 
 8     void Step4(){
 9         //...
10     }
11 };
12 
13 int main()
14 {
15     Library lib;  //这里都是以类的方式来调用方法的
16     Application app;
17 
18     lib.Step1();
19 
20     if (app.Step2()){
21         lib.Step3();
22     }
23 
24     for (int i = 0; i < 4; i++){
25         app.Step4();
26     }
27 
28     lib.Step5();
29 
30 }

对应的库的代码:

template1_lib.cpp:

 1 //程序库开发人员
 2 class Library{
 3 
 4 public:
 5     void Step1(){
 6         //...
 7     }
 8 
 9     void Step3(){
10         //...
11     }
12 
13     void Step5(){
14         //...
15     }
16 };

这里的主体程序流程,实际上框架开发者已经设计好了,常常是稳定的.

因此更好的解决方案是,库开发者把流程写好,一些需要开发者实现的接口定义好,留给开发者实现:

改进后的代码:

template2_lib.cpp:

 1 //程序库开发人员
 2 class Library{
 3 public:
 4     //稳定 template method
 5     void Run(){
 6         
 7         Step1();
 8 
 9         if (Step2()) { //支持变化 ==> 虚函数的多态调用
10             Step3(); 
11         }
12 
13         for (int i = 0; i < 4; i++){
14             Step4(); //支持变化 ==> 虚函数的多态调用
15         }
16 
17         Step5();
18 
19     }
20     virtual ~Library(){ }
21 
22 protected:  //采用protected,让子类能够访问到.
23     
24     void Step1() { //稳定
25         //.....
26     }
27     void Step3() {//稳定
28         //.....
29     }
30     void Step5() { //稳定
31         //.....
32     }
33 
34     virtual bool Step2() = 0;//变化
35     virtual void Step4() =0; //变化
36 };

template2_app.cpp:

 1 //应用程序开发人员
 2 class Application : public Library {
 3 protected:
 4     virtual bool Step2(){
 5         //... 子类重写实现
 6     }
 7 
 8     virtual void Step4() {
 9         //... 子类重写实现
10     }
11 };
12 
13 
14 
15 
16 int main()
17     {
18         Library* pLib=new Application();
19         lib->Run();
20 
21         delete pLib;
22     }
23 }

注意一下:

基类的析构函数要写成虚的,否则调用不到子类的析构函数,因为如果不是虚函数的话,

基类指针只能找到基类的析构函数,delete时只会调用基类的析构函数;而析构函数为虚函数时,则基类指针可以找到子类对应的析构函数.

 

 红色部分时稳定的,蓝色部分是变化的.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
模板方法模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现留给子去完成。在模板方法模式中,抽象定义了一个模板方法,该方法中包含了算法的整体流程,同时也定义了一些基本方法和钩子方法供子实现或重写。 在Java中,可以通过抽象和具体子来实现模板方法模式。抽象负责定义模板方法以及基本方法和钩子方法,而具体子则负责实现或重写这些方法。 下面是一个示例代码: ```java // 抽象/抽象模板角色 public abstract class AbstractClass { // 模板方法 public void TemplateMethod() { SpecificMethod(); if (hookMethod()) { abstractMethod(); } } // 具体方法 public void SpecificMethod() { System.out.println("抽象中的具体方法被调用..."); } // 钩子方法 public boolean hookMethod() { return false; } // 抽象方法 public abstract void abstractMethod(); } // 具体子/具体实现角色 public class ConcreteClass extends AbstractClass { @Override public boolean hookMethod() { return true; } public void abstractMethod() { System.out.println("抽象方法的实现被调用..."); } } // 客户端角色 public class Client { public static void main(String[] args) { AbstractClass ac = new ConcreteClass(); ac.TemplateMethod(); } } ``` 总结: 1. 优点:利用模板方法将相同处理逻辑的代码放到抽象父中,可以提高代码的复用性。不同的代码在不同子中,通过对子的扩展增加新的行为,提高代码的扩展性。把不变的行为写在父上,去除子的重复代码,提供了一个很好的代码复用平台,符合开闭原则。 2. 缺点:的个数增加,系统更加庞大,设计也更加抽象,间接地增加了系统实现的复杂度。父中的抽象方法由子实现,子执行的结果会影响父的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。由于继承关系自身的缺点,如果父添加新的抽象方法,则所有子都要改一遍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingLife99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值