无处不在的模板方法模式

话说网上总结的设计模式都以单例,工厂,观察者等模式最多,但是我个人觉得真正无处不在的却是模板方法。曾经有一位微软的讲师说过如果你只想学一种设计模式,那就模板方法吧。

笔者曾经开发过一款安全软件,其中负责云扫描模块。当然扫描部分也不止只用在云查杀部分,例如附带的清理功能,保险箱扫描可保护的软件都会用到扫描文件功能。但是如果分开写几套扫描逻辑却实在不可取,于是当时我用了下面的设计:

class IScanBase
{
public:
	BOOL ScanFile(CString strPath)
	{
		//省略扫描逻辑,调用GetFileInfo判断
		GetFileInfo(strPath);
	}
protected:
	BOOL GetFileInfo(CString strFilePath) = 0;
};

class CCloudScan
{
protected:
	BOOL GetFileInfo(CString strFilePath)
	{
		//省略判断是否木马
	}
};

这样设计的好处就是查杀模块以及会扩展的保险箱模块,清理模块共用一套扫描机制,扫描逻辑存在于父类当中,而子类可以根据不同的需求修改接口逻辑从而实现不同的功能,这就是模板方法模式的应用。模板方法定义如下:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。上述代码中算法骨架就是扫描逻辑,而延生到子类中的就是根据不同需要针对文件处理的逻辑,通过上述设计即使是以后如果要新增需求也只需要增加相应的类即可。

其实这种设计在很多框架中都有用到,下面举几个例子说明:

MFC中的模板方法: 1、CView类中的virtual void OnDraw(CDC* pDC) = 0;接口就是明显的模板方法模式,该接口在void CView::OnPaint()中被调用。而Coder只用关系如何修改OnDraw而压根不用去关注该接口何时或者在什么时机被调用,该设计方法与上述测试代码如出一辙。

2、实现过MFC自绘控件的朋友都知道void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);这个函数往往是从void CWnd::OnDrawItem(int /*nIDCtl*/, LPDRAWITEMSTRUCT lpDrawItemStruct)调用过来,而最早也是为了响应WM_DRAWITEM。这一套消息流程源码清晰可见,本人便不再多讲。但是用设计来说,这也是典型的模板方法模式的应用。比如说要自绘一个按钮,Coder只需要重新实现DrawItem即可,至于他怎么被调用或者何时被调用压根不用关心。

3、改变MFC消息控制流的函数virtual BOOL PreTranslateMessage(MSG* pMsg);该函数是消息在到TranslateMessage之前被调用,通过重载这个函数我们可以改变MFC的消息流程。事实上该函数也是CWnd中的虚函数,如果我们做改写也可以达到我们自己的目的如拦截XX消息之类。细看该实现过程其实也是类似但并不完全是模板方法模式。

Duilib中的模板方法: 在开源的DuiLib中有一个这样的函数:

void CControlUI::DoPaint(HDC hDC, const RECT& rcPaint)
{
    if( !::IntersectRect(&m_rcPaint, &rcPaint, &m_rcItem) ) return;

    // 绘制循序:背景颜色->背景图->状态图->文本
    PaintBkColor(hDC);
    PaintBkImage(hDC);
    PaintStatusImage(hDC);
    PaintText(hDC);
    PaintBorder(hDC);
}

其实被调用的Paing系列函数全都是CControlUI内部的虚函数,当CControlUI的子类也就是虚拟控件类需要实现自己的界面显示时只需要重写上面的Paint系列函数即可,至于何时调用不用关心。其实这也是典型的模板方法模式的应用。

事实上MFC,DuiLib中用到的模板方法还不止这些,如果仔细看来还能挖掘。但是对于我们来说不管体会才能更深的领悟设计模式的精髓。

无处不在的模板方法模式

时间: 2024-10-04 11:47:22

无处不在的模板方法模式的相关文章

设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)

一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. 二.模板方法模式的应用场景 Template Method模式一般应用在具有以下条件的应用中: - 具有统一的操作步骤或操作过程 - 具有不同的操作细节 - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同 private static void Main(string[] arg

JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来聊聊final这个关键字 final可以修饰类,方法和变量 final修饰的类不可以被继承 final修饰的方法不可以被覆盖 final修饰的变量是一个常量,只能被赋值一次 内部类只能访问被final修饰的局部变量 final,故名思意,就是最终的意思,由以上的五种特性,不过final的出现,也是有

《JavaScript设计模式与开发实践》读书笔记之模板方法模式

1. 模板方法模式 1.1 面向对象方式实现模板方法模式 以泡茶和泡咖啡为例,可以整理为下面四步 把水煮沸 用沸水冲泡饮料 把饮料倒进杯子 加调料 首先创建一个抽象父类来表示泡一杯饮料 var Beverage=function(){}; Beverage.prototype.boilWater=function(){ console.log('把水煮沸'); }; Beverage.prototype.brew=function(){};//空方法,由子类重写 Beverage.prototy

面向对象编程思想-模板方法模式

一.引言 说到模板,顾名思义:就是样板,整体架构已经有了,你只需要填充自己的特定内容就可以了.如:简历模板,论文模板,PPT模板等 在软件设计中,模板方法模式与之很相似,下面请看我们今天要学习的模板方法模式 二.模板方法模式 定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 下面结构图: 抽象模板角色(AbstractClass):在抽象类中定义一个或多个基本操作,每一个操作对应算法中一个步骤:同时提供一个模板方法

(九)模板方法模式

  转载:http://www.cnblogs.com/zuoxiaolong/p/pattern10.html 模板方法模式,这是一个在许多优秀的开源项目中LZ见的最多的一个设计模式,也是LZ觉得最为优秀的一个设计模式,所以这一章LZ会尽自己所能的去尽量将这个设计模式解释清楚. 模板方法模式,一般是为了统一子类的算法实现步骤,所使用的一种手段或者说是方式.它在父类中定义一系列算法的步骤,而将具体的实现都推迟到子类. 最典型的形式就是一个接口,一个抽象父类,父类中会有一系列的抽象方法,而在子类中

java设计模式 模板方法模式Template Method

设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因.

模板方法模式

定义:一个模板方法用一些抽象的操作定义一个算法,而子类将重定义这些操作以提供具体行为; 意图:定义了一个在操作中的一个算法框架,把一些步骤推迟到子类中去实现.模板方法模式让子类不需要改变算法结构而重定义特定的算法步骤; 比如 Work(){ ①   准备 ②   实施 ③   结束 } 可以将第二步实施声明为抽象方法,因为每个人实施的过程不同 1 public class TemplateDemo{ 2 public static void main(String []atgs){ 3 Teac

JAVA设计模式(17):行为型-模板方法模式(Template Method)

场景 客户到银行办理业务: 取号排队 办理具体现金/转账/企业/个人/理财业务 给银行工作人员评分 核心: 处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用工厂方法模式,,将这个节点的代码实现转移给子类完成. 即:处理步骤父类中定义好,具体实现延迟到子类中定义. 概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑

[设计模式]模板方法模式

1. 定义 定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现.模板方法使得子类可以不改变一个算法的结构而重定义该算法中某些特定的步骤. 2. 类图 AbstractClass:抽象类,用来定义算法骨架和原语操作,具体的子类通过重定义这些原语操作来实现一个算法的各个步骤,在这个类中,也可以提供原语的默认实现. ConcreteClass:具体实现类.用来实现算法骨架中的某些步骤,完成与特定子类的功能. 3. 示例 package com.jerry.designpattern; /** *