c++ 设计模式3 (重构技法 Template Method)
1. 重构
面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”指的是那些可以满足
“应对变化,提高复用”的设计。
设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而更好地理解需求的变化”
“什么时候、什么地点应设计模式”比“理解设计模式结构本身”更为重要。
设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一部到位
的设计模式。敏捷软件开发提倡“Refactoring to Patterns”是目前普遍公认的最好的使用
设计模式的方法。
2 重构关键技法
技法与原则比某一个单纯的模式重要。
1) 静态 -> 动态
2)早绑定 -> 晚绑定
3) 继承 -> 组合
4) 编译时依赖 -> 运行时依赖
5) 紧耦合 -> 松耦合
3. 组件协作类模式(Template Method, Strategy, Observer)
现在软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,
来实现框架与应用的松耦合,是二者之间协作时常用的模式。
3.1 Template Method
动机: 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。
如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或晚期实现需求?
代码实例:
方法2 相对于 方法1,由程序库开发人员实现程序主流程,留下虚函数step2, step4,供应用程序开发人员晚绑定实现。
如图所示:



回到Template Method定义:
定义一个操作的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override)该算法的某些特定步骤。
类图关系:
红色稳定,蓝色变化。

要点总结:
Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的拓展点,是代码复用方面的基本实现结构;
除了可以灵活应对子步骤的变化外,”不要调用我,让我来调用你“的反向控制结构是Template Method的典型应用;
在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法,纯虚方法),但一般推荐将它们设置为protected 方法。
//程序库开发人员
//template_lib1.cpp
class Library{ public:
void Step1(){
//...
} void Step3(){
//...
} void Step5(){
//...
}
}; //应用程序开发人员
//template_app1.cpp
class Application{
public:
bool Step2(){
//...
} void Step4(){
//...
}
}; int main()
{
Library lib();
Application app(); lib.Step1(); if (app.Step2()){
lib.Step3();
} for (int i = ; i < ; i++){
app.Step4();
} lib.Step5(); } //程序库开发人员
//template_lib1.cpp
class Library{
public:
//稳定 template method
//稳定中有变化,很多设计模式的代码结构
void Run(){ Step1(); if (Step2()) { //支持变化 ==> 虚函数的多态调用
Step3();
} for (int i = ; i < ; i++){
Step4(); //支持变化 ==> 虚函数的多态调用
} Step5(); }
virtual ~Library(){ } protected: void Step1() { //稳定
//.....
}
void Step3() {//稳定
//.....
}
void Step5() { //稳定
//.....
} virtual bool Step2() = ;//变化
virtual void Step4() =; //变化
}; //应用程序开发人员
//template_app1.cpp
class Application : public Library {
protected:
virtual bool Step2(){
//... 子类重写实现
} virtual void Step4() {
//... 子类重写实现
}
}; int main()
{
Library* pLib=new Application();
lib->Run(); delete pLib;
}
}
c++ 设计模式3 (重构技法 Template Method)的更多相关文章
- 瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)
简介 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template M ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 深入浅出设计模式——模板方法模式(Template Method Pattern)
模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式 ...
- 设计模式之美:Template Method(模板方法)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Template Method 模式结构样式代码. 意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. Templat ...
- 23种设计模式之模板方法(Template Method)
模板方法模式是一种类的行为型模式,用于定义一个操作中算法的骨架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,其缺点是对于不同的实现,都需要定义 ...
- 二十四种设计模式:模板方法模式(Template Method Pattern)
模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...
- 设计模式(三)Template Method模式
在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为Template Method模式即模板方法模式. 根据下面的示例程序理解模板方法模式. package BigJunOba.bjtu.Te ...
- 设计模式 | 模板方法模式(template method)
定义: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构:(书中图,侵删) 一个定义整体框架的父类 若干不同具体实现 ...
- GJM: 设计模式 - 模板方法模式(Template Method)
生活中的模板 一.在银行办理业务 Step1:进门取号 Step2:填写单据 Step3:等待叫号 Step4:窗口办理 二.奥运会开幕式 第一步:升国旗奏国歌 第二步:领导人致辞讲话 第三部: 文艺 ...
随机推荐
- 转】使用kaptcha生成验证码
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4221848.html 感谢! kaptcha是一个简单好用的验证码生成工具,通过配置,可以自己定义验证码大小.颜 ...
- mysql慢查询Slow Query Log和未使用索引(Not Using Indexes)查询配置和使用
mysql的“慢查询”指的是超过了允许的最大查询时间(long_query_time)的sql语句,而“未使用索引”查询顾名思义就是查询语句没有使用到索引的sql语句. 慢查询配置和使用 在msyql ...
- 用 Python 脚本实现对 Linux 服务器的监控
目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统 ...
- tryparse的用法,^0*[1-9]\d*$
Entry entry = new Entry(); Int32 iParam; if(Int32.TryParse(entry.ajh,out iParam)) { /*如果转换成功就输出iPara ...
- django admin site配置(二)
1. ModelAdmin.inlines 将有外键的子类包含进视图 ,实例: class Author(models.Model): name = models.CharField(max_leng ...
- HDU 4493 Tutor (控制精度)
题意:给定12个数,求平均数. 析:这个题就是精度控制问题,如果控制精度,最好的办法就是用整型了. 代码如下: #include <cstdio> #include <string& ...
- Lotus 迁移到Exchange POC 之安装Exchange 2010!
我们登录到Exchange 2010服务器,双击setup 安装Exchange 2010,双击setup.exe完成安装:
- 关于heritrix安装配置时出现”必须限制口令文件读取访问权限”的解决方法
转载:http://www.floatinglife.cn/关于heritrix安装配置时出现必须限制口令文件读取访问 最近开始写一个RSS聚合程序,需要爬虫支持,于是就整来heritrix,没想到, ...
- Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口
1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...
- wpf随笔
因项目需要查找wpf.DataGrid的Binding方法, 由于其属于Dev框架体系内,偏向于winform并无Binding 1.且线程外更改UI控件还需要委托或者action,而Wpf控件仅需要 ...