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的更多相关文章

  1. 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

      设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...

  2. 设计模式13:Template Method 模板方法模式(行为型模式)

    Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特 ...

  3. 设计模式C++学习笔记之九(Template Method模板方法模式)

      模板模式也是相当简单的一种模式,而且是比较常用的.模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些 ...

  4. 设计模式Template Method模式(Template Method)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还 ...

  5. 设计模式 Template Method模式 显示程序猿的一天

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 不断设计模式~ Template Method模式 老套路,看高清 ...

  6. Template Method 模板方法

      简介 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的细节 抽象模板AbstractClass的方法分为两类: 基本 ...

  7. C++设计模式:Template Method

    我使用过一个简单的后台服务框架.这个框架上手很容易,我只需要继承一个基类,同时实现,或重写(override)基类声明的几个接口(这些接口声明为虚函数,或者纯虚函数),然后调用基类定义好的run()函 ...

  8. Template Method 模板方法 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. php设计模式(一):简介及创建型模式

    我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式. 一.设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用.容易被他人理解的.可靠的代码设计经验的总结. ...

随机推荐

  1. lamp centos下一键安装

    系统需求 系统支持:CentOS 6+/Debian 7+/Ubuntu 12+ 内存要求:≥ 512MB 硬盘要求:至少 5GB 以上的剩余空间 服务器必须配置好 软件源 和 可连接外网 必须具有系 ...

  2. 详细解读Python中的__init__()方法

    init()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是init()参数值可以有多种形式. 因为有很多种方式为init ...

  3. JavaScript学习笔记——4.数组

    数组(Array) 数组也是一个对象   数组中保存的内容我们称为元素 数组的操作 - 创建数组 - var arr = new Array();   - var arr = []; 例如:var m ...

  4. DIV做的Table

    <style> div.table{ border:1px solid #d7d7d7; margin-left:0px; border-bottom-width:; width:1200 ...

  5. XAF实现交叉分析

    如何实现如图的交叉分析? In this lesson, you will learn how to add the Analysis functionality to your applicatio ...

  6. 洛谷 P1486 [NOI2004]郁闷的出纳员

    题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...

  7. 20165224 陆艺杰 Exp3 免杀原理与实践

    杀软是如何检测出恶意代码的? 识别代码特征码 监测像后门的行为 (2)免杀是做什么? 让后面程序不被安全软件发现 (3)免杀的基本方法有哪些? 多方式编码 半手工shellcode编程 完全自己写没有 ...

  8. prcharm 注册码

    JetBrains全系列在线激活中心 使用方法: 1. 点击Help,选择Register.打开注册页面. 2. 选择License server, 在License server address 中 ...

  9. P2048 [NOI2010]超级钢琴

    传送门 考虑维护前缀和 $sum[i]$ 那么对于每一个位置 $i$ ,左端点为 $i$ 右端点在 $[i+L-1,i+R-1]$ 区间的区间最大值容易维护 维护三元组 $(o,l,r)$ ,表示左端 ...

  10. vue控制父子组件渲染顺序

    在父组件中,如下图渲染子组件,那如何在父组件中加入一些数据获取逻辑且能控制子组件渲染呢. 就是像在上图中红框圈起来的那样,挂个 ok(其他你自己定义的也可以) 参数,同时在父组件的任何生命周期中去改变 ...