首页 > 其他分享 >Template Method设计模式

Template Method设计模式

时间:2022-11-22 14:06:41浏览次数:40  
标签:cout void Library Application Template 设计模式 Method


Template Method

动机(Motivation)

  • 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。
  • 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

模式定义

定义一个操作中的算法的骨架 (稳定) ,而将一些步骤延迟 (变化) 到子类中。
Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的
某些特定步骤。
——《 设计模式》 GoF

要点总结

  • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)
    为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
  • 除了可以灵活应对子步骤的变化外, “不要调用我,让我来调用你” 的反向控制结构是Template Method的典型应用,即实现晚绑定
  • 在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。原因是这些方法是基于流程的,往往前后都有依赖的步骤,不是单纯的当做public调用。

早绑定和晚绑定程序对比:

程序对比

早绑定

Library

#include <iostream>

using namespace std;

class Library
{

public:
void Step1()
{
cout << "Step1" << endl;
}

void Step3()
{
cout << "Step3" << endl;
}

void Step5()
{
cout << "Step5" << endl;
}
};

Application

#include "template1_lib.cpp"

//应用程序开发人员
class Application
{
public:
bool Step2()
{
cout << "myStep2" << endl;
return true;
}

void Step4()
{
cout << "myStep4" << endl;
}
};

int main()
{
Library lib;
Application app;

lib.Step1();

if (app.Step2())
{
lib.Step3();
}

for (int i = 0; i < 4; i++)
{
app.Step4();
}

lib.Step5();
}

晚绑定

Library

#include <iostream>

using namespace std;

//程序库开发人员
class Library
{
public:
//稳定 template method
void Run()
{
Step1();

if (Step2())
{ //支持变化 ==> 虚函数的多态调用
Step3();
}

for (int i = 0; i < 4; i++)
{
Step4(); //支持变化 ==> 虚函数的多态调用
}

Step5();
}
virtual ~Library() {}

protected:
void Step1()
{ //稳定
cout << "Step1" << endl;
}
void Step3()
{ //稳定
cout << "Step3" << endl;
}
void Step5()
{ //稳定
cout << "Step5" << endl;
}

virtual bool Step2() = 0; //变化
virtual void Step4() = 0; //变化
};

Application

#include "template2_lib.cpp"
#include <iostream>

using namespace std;

//应用程序开发人员
class Application : public Library
{
protected:
virtual bool Step2()
{
//... 子类重写实现
cout << "override Step2" << endl;
return true;
}

virtual void Step4()
{
//... 子类重写实现
cout << "override Step4" << endl;
}
};

int main()
{
Library *pLib = new Application();
pLib->Run();

delete pLib;
}


标签:cout,void,Library,Application,Template,设计模式,Method
From: https://blog.51cto.com/u_13875041/5877890

相关文章

  • Observer设计模式
    Observer/Event动机(Motivation)在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。......
  • Decorator设计模式
    Decorator动机(Motivation)在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能......
  • Strategy设计模式
    程序的复用性是二进制层面的复用,而不是代码的复制粘贴Strategy动机(Motivation)在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使......
  • Golang编译缓存与实际项目不一致时报错has no field or method
    go1.9不明确是不是只在这个版本有小bug,有时候对最新进度的项目编译,会报上一个版本的错误,甚至改动无法编译,报出类似下面的错误:util\common\tools.go:2217:19:dtp.ClearWhe......
  • jQuery validator addMethod 动态提示信息
    $.validator.addMethod('PD_password',function(value,element){varlen=value.length;if(len<6){$(element).data('error-msg','长度不能少于6......
  • Android设计模式系列(7)--SDK源码之命令模式
    命令模式,在.net,java平台的事件机制用的非常多,几乎每天都与之打交道。android中对我印象最深的就是多线程多进程的环境,所以必然大量使用到Runbable,Thread,其实用的就是最......
  • Android设计模式系列(1)--SDK源码之组合模式
    Android设计模式系列(1)–SDK源码之组合模式Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用。在androidUI设计,几乎所有的widget和布局类......
  • 设计模式
    设计模式共有23中设计模式,Gof23。GoF23一种思维,一种态度,一种进步 创建型模式:(描述怎么创建一个对象)单例模式、工厂模式、抽象工厂模式、建造者模式、原型......
  • js设计模式=封装
    js封装案例【1】<script>varBook=function(num){varnum;//类私有变量varname;//类私有变量functioncheck(){};//类私有方法this.checkName=functio......
  • Java设计模式 - 24种
    设计模式的七大原则   开闭原则:对扩展开放、对修改关闭。   单一指责原则:一个类只做一件事。   依赖倒转原则:类似于ioc,采用接口编程。   迪米特原则:高内聚......