【设计模式】template method(模板方法)-- 类行为型模式5.10
1.意图
子类在不改变父类的算法结构的情况下,可以重定义算法的某些特定步骤
2.动机
模板方法用一些抽象的操作定义一个算法,子类重定义这些操作以提供具体的行为;步骤的顺序定了,但实现可以调整;
3.适用性
1)一次性实现算法不变部分,并将可变的行为留给子类来实现
2)子类中的公共行为应该被提取出来并集中到一个公共父类中以避免代码重复
3)hook操作,方便子类扩展,定义好hook方法留空,等需要的时候由子类去实现
4.结构
5.参与者
AbstractClass:
定义抽象的原语操作PrimitiveOperation,子类会重写它
定义模板方法,实现算法骨架;模板方法会调用PrimitiveOperation方法,也会调用抽象类中的其他方法
ConcreteClass:
重写PrimitiveOperation,来实现算法细节
6.协作
ConcreteClass靠AbstractClass来实现算法的不变部分,自己实现可变部分
7.效果
1)代码复用的基本技术,常见于类库中提取类库的公共行为
2)导致反向控制,即父类调用子类的方法
3)模板方法会调用如下操作
具体的操作(非抽象类的一些方法,可以是ConcreteClass,也可以是客户类)
具体的AbstractClass操作(AbstractClass的方法,通常会对自己有用)
原语操作PrimitiveOperation,也称抽象操作(必须被重定义)
Factory Method
钩子操作HookOperation(可以被重定义),在抽象类里一般提供缺省操作(空操作),子类在需要的时候可以重定义,也可以不重定义
4)必须在设计的时候明确哪些是原语操作,哪些是钩子操作
5)子类可以继承重写父类方法,但重写的时候又想要先调用父类方法,再加上重写新加的部分,此时很容易忘记调用父类方法,如下
void DerivedClass::Operation(){
ParentClass::Operation(); // 如果有很多子类,这个调用容易遗漏
//***其他要扩展的内容
}
可以用模板方法来实现上面的要求,省去每次都调用父类方法的麻烦
void ParentClass::Operation(){
//** 公共操作
HookOperation();
}
void ParentClass::HookOperation() {} //缺省操作,子类需要就自己重定义
void DerivedClass:HookOperation(){ // ***子类的扩展内容}
8.实现
1).使用C++访问控制:
模板方法调用的原语操作可以定义为protected(只能在类内部调用,不能被外部调用,且派生类也可以访问)
必须重定义的原语操作定义为纯虚函数
模板方法自身不需要重定义,因此模板方法定义为非虚成员函数
2)尽量减少原语操作:因为需要重定义的操作越多,客户程序就越冗长
3)命名约定:如需要被重定义的原语操作可以加前缀 Do,如DoRead
9.日常开发项目应用
地图玩法里面,玩家进入地图操作EnterMap,里面定义了步骤,在父类common_map里定义了DoEnterMap为缺省的操作,子类xxx_map里可以自定义DoEnterMap的内容;
【设计模式】template method(模板方法)-- 类行为型模式5.10的更多相关文章
- 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...
- 设计模式13:Template Method 模板方法模式(行为型模式)
Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特 ...
- 设计模式C++学习笔记之九(Template Method模板方法模式)
模板模式也是相当简单的一种模式,而且是比较常用的.模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些 ...
- 设计模式Template Method模式(Template Method)摘录
23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还 ...
- 设计模式 Template Method模式 显示程序猿的一天
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 不断设计模式~ Template Method模式 老套路,看高清 ...
- Template Method 模板方法
简介 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的细节 抽象模板AbstractClass的方法分为两类: 基本 ...
- C++设计模式:Template Method
我使用过一个简单的后台服务框架.这个框架上手很容易,我只需要继承一个基类,同时实现,或重写(override)基类声明的几个接口(这些接口声明为虚函数,或者纯虚函数),然后调用基类定义好的run()函 ...
- Template Method 模板方法 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- php设计模式(一):简介及创建型模式
我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式. 一.设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用.容易被他人理解的.可靠的代码设计经验的总结. ...
随机推荐
- 洛谷P4525 【模板】自适应辛普森法1
题面 传送门 题解 我似乎连积分都不太熟练→_→ 总之就是对于一个原函数,我们找一个二次函数来近似它,那么有 \[ \begin{aligned} \int_a^bf(x)dx &\appro ...
- centos7 docker 安装 mysql5.7.24 导入12G的sql
先在CentOS7里面安装docker Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker .通过 uname - ...
- 老男孩Day10作业:主机管理程序
一.作业需求: 1, 运行程序列出主机组或者主机列表 2,选择指定主机或主机组 3,选择主机或主机组传送文件(上传/下载) 4,充分使用多线程或多进程 5,不同主机的用户名,密码,端口可以不同 6,可 ...
- Python数组(二)
一.函数list 可将任何序列(如字符串)作为list的参数.list实际上是一个类,而不是函数. test=['java','C#','C','C++'] print(list(test)) ——& ...
- CodeCraft-19 and Codeforces Round #537 (Div. 2) C. Creative Snap 分治
Thanos wants to destroy the avengers base, but he needs to destroy the avengers along with their bas ...
- XAF ORMDataModel构建的基础资料对象无法被调用显示的解决办法
修正,其实只要在基础资料类中加入[XafDefaultProperty("名称")]标签即可. namespace NEO.ERP.Module.BusinessObjects.B ...
- Qt 学习之路 2(38):存储容器
Qt 学习之路 2(38):存储容器 豆子 2013年1月14日 Qt 学习之路 2 38条评论 存储容器(containers)有时候也被称为集合(collections),是能够在内存中存储其它特 ...
- linux中tr的功能多多
功能 通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能. 您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符.您也可以用它来 ...
- BZOJ - 1458 / P4311 最大流应用 贪心
题意:给定n*m的图,每个士兵可以占领当前行和列,第i行至少要R[i]个士兵占领,第j列至少要C[j]个士兵占领,部分网格无法占领,求占领所用最少士兵数,若无解则输出orz 士兵的贡献情况有1(只有效 ...
- Linux——文件和文件夹的操作
Linux有三种文件: 普通文件(包括文本文件.源码文件.可执行文件等等) 设备文件(或者成为特殊文件,linux通过设备文件与外部设备进行通讯,例如:光驱.打印机.终端.modern) 设备文件有两 ...