博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(十)——模板方法模式
阅读量:4941 次
发布时间:2019-06-11

本文共 2018 字,大约阅读时间需要 6 分钟。

AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,

每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),

用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。

ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作

优点:

(1) 在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序。

(2) 模板方法模式是一种代码复用技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行
 为,它鼓励我们恰当使用继承来实现代码复用。
(3) 可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特
(4) 在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则
和开闭原则。

 

适用场景

(1)具有统一的操作步骤或操作过程;
(2) 具有不同的操作细节;
(3) 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各
不相同;

 

在抽象类中统一操作步骤,并规定好接口;让子类实现接口。这样

可以把各个具体的子类和操作步骤解耦合。

 

#include 
using namespace std;class MakeDrink{public: MakeDrink(bool add):m_add(add){} // 通用接口 virtual void boil_water() { cout << "煮水" << endl; } // 冲泡,特殊接口 virtual void brew() = 0; // 通用接口 virtual void pour_in_cup() { cout << "倒入杯中" << endl; } // 添加佐料 virtual void add_condiment() = 0; // 钩子函数,子类可以通过修改它来控制既有流程得到改变 virtual bool customer_want_condiment() { return m_add; } void make() { boil_water(); brew(); pour_in_cup(); if ( customer_want_condiment() ) add_condiment(); }protected: bool m_add;};class Coffee :public MakeDrink{public: Coffee(bool add):MakeDrink(add) {} virtual void brew() { cout << "咖啡" << endl; } virtual void add_condiment() { cout << "加糖" << endl; }};class Tea :public MakeDrink{public: Tea(bool add):MakeDrink(add) {} virtual void brew() { cout << "茶" << endl; } virtual void add_condiment() { cout << "柠檬" << endl; }};int main(){ MakeDrink* coffee = new Coffee(true); coffee->make(); cout << "------------------" << endl; MakeDrink* tea = new Tea(false); tea->make(); system("pause"); return 0;}

 

转载于:https://www.cnblogs.com/xiangtingshen/p/10381079.html

你可能感兴趣的文章
Quartz Core之CALayer
查看>>
java:一个项目的开发过程(转)
查看>>
express框架学习笔记
查看>>
操作系统下载路径
查看>>
网站开发 关于图片压缩 以及图片使用
查看>>
hive的count(distinct id)测试--慎用
查看>>
第九周周总结
查看>>
Logistic Regression
查看>>
8lession-基础类型转化
查看>>
FlashCS5作成SWC,在Flex4中使用(1)
查看>>
vue-cli目录结构及说明
查看>>
JS 数据类型转换
查看>>
WeQuant交易策略—RSI
查看>>
osgearth将视点绑定到一个节点上
查看>>
PHP 当前时间秒数+数值,然后再转换成时间。
查看>>
数据交互 axios 的使用
查看>>
bootloader,kernel,initrc
查看>>
Java中jshell脚本
查看>>
performSelector的方法
查看>>
redis
查看>>