【设计模式】模版方法模式

1、定义

1.1 标准定义

Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.TemplateMethod lets subclasses redefine certain steps of an algorithm without changing the algorithm‘sstructure.( 定义一个操作中的算法的框架, 而将一些步骤延迟到子类中。 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 )

1.2 通用类图

● 基本方法

基本方法也叫做基本操作, 是由子类实现的方法,
并且在模板方法被调用。

● 模板方法

可以有一个或几个, 一般是一个具体方法,
也就是一个框架, 实现对基本方法的调度,完成固定的逻辑。

2、实现

2.1 类图

2.2 代码

2.2.1 模版类

// TemplateMethod.h

#ifndef _TEMPLATEMETHOD_H_
#define _TEMPLATEMETHOD_H_

//抽象模板,并定义了一个模板方法。
class AbstractClass
{
public:
    ~AbstractClass();
    //具体的模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们都推迟到子类中实现
    void TemplateMethod();

protected:
    AbstractClass();

    //一些抽象行为,放到子类中去实现
    virtual void PrimitiveOperation1()=0;
    virtual void PrimitiveOperation2()=0;
};

//实现基类所定义的抽象方法
class ConcreteClassA : public AbstractClass
{
public:
    ConcreteClassA();
    ~ConcreteClassA();

protected:
    //实现基类定义的抽象行为
    virtual void PrimitiveOperation1();
    virtual void PrimitiveOperation2();
};

//实现基类所定义的抽象方法
class ConcreteClassB : public AbstractClass
{
public:
    ConcreteClassB();
    ~ConcreteClassB();

protected:
    //实现基类定义的抽象行为
    virtual void PrimitiveOperation1();
    virtual void PrimitiveOperation2();
};

#endif
//TemplateMethod.cpp

#include "TemplateMethod.h"
#include <iostream>

using namespace std;

AbstractClass::AbstractClass(){}

AbstractClass::~AbstractClass(){}

void AbstractClass::TemplateMethod()
{
    this->PrimitiveOperation1();
    this->PrimitiveOperation2();
}

ConcreteClassA::ConcreteClassA(){}

ConcreteClassA::~ConcreteClassA(){}

void ConcreteClassA::PrimitiveOperation1()
{
    cout << "ConcreteClassA::PrimitiveOperation1" << endl;
}

void ConcreteClassA::PrimitiveOperation2()
{
    cout << "ConcreteClassA::PrimitiveOperation2" << endl;
}

ConcreteClassB::ConcreteClassB(){}

ConcreteClassB::~ConcreteClassB(){}

void ConcreteClassB::PrimitiveOperation1()
{
    cout << "ConcreteClassB::PrimitiveOperation1" << endl;
}

void ConcreteClassB::PrimitiveOperation2()
{
    cout << "ConcreteClassB::PrimitiveOperation2" << endl;
}

2.2.2 调用

// main.cpp

#include "TemplateMethod.h"

int main()
{
    //ConcreteClassA与ConcreteClassB可相互替换
    AbstractClass* pAbstract = new ConcreteClassA();
    pAbstract->TemplateMethod();

    pAbstract = new ConcreteClassB();
    pAbstract->TemplateMethod();

    return 0;
}

3、优缺点

3.1 优点

● 封装不变部分, 扩展可变部分

把认为是不变部分的算法封装到父类实现, 而可变部分的则可以通过继承来继续扩展。增加一个子类, 实现父类的基本方法就可以了。

● 提取公共部分代码, 便于维护
将通用流程提取到父类实现,可以集中管理维护,如果散乱的流程在各个子类,很难维护。

● 行为由父类控制, 子类实现

基本方法是由子类实现的, 因此子类可以通过扩展的方式增加相应的功能, 符合开闭原则。

3.2 缺点

按照我们的设计习惯, 抽象类负责声明最抽象、 最一般的事物属性和方法, 实现类完成具体的事物属性和方法。 但是模板方法模式却颠倒了, 抽象类定义了部分抽象方法, 由子类实现, 子类执行的结果影响了父类的结果, 也就是子类对父类产生了影响, 这在复杂的项目中, 会带来代码阅读的难度, 而且也会让新手产生不适感。

4、使用场景

● 多个子类有公有的方法, 并且逻辑基本相同时。

● 重要、
复杂的算法, 可以把核心算法设计为模板方法, 周边的相关细节功能则由各个子类实现。

● 重构时,
模板方法模式是一个经常使用的模式, 把相同的代码抽取到父类中, 然后通过钩子函数约束其行为。

时间: 2024-10-25 21:04:31

【设计模式】模版方法模式的相关文章

设计模式 模版方法模式 展现程序员的一天

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤. 简单看下定义,模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现.定义还算清晰,下面来个例子展示下本公司的上班情况(纯属娱乐,如有雷同,请对号入座).简单描述一下:本公司有程序猿.测试

设计模式 -- 模版方法模式

模板方法模式:定义一个算法的执行骨架,将具体的算法实现延迟到子类完成. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤.代表这些具体逻辑步骤的方法称做基本方法(primitive method):而将这些基本方法汇总起来的方法叫做模板方法(template method),这个设计模式的名字就是从此而来. 举个例子: 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃

Java设计模式の模版方法模式

概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 比如定义一个操作中的算法的骨架,将步骤延迟到子类中.模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤. 模式中的角色 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架. 具体类(ConcreteClass):实

Python设计模式——模版方法模式

1.模版方法模式 做题的列子: 需求:有两个学生,要回答问题,写出自己的答案 #encoding=utf-8 __author__ = '[email protected]' class StudentA(): def answer1(self): print '题目一:XXXXXX' print '我的答案是:B' def answer2(self): print '题目一:XXXXXX' print '我的答案是:B' class StudentB(): def answer1(self):

24种设计模式--模版方法模式【Template Method Pattern】

周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的口子打开了,要我们做悍马模型,虽然是第一个车辆模型,但是我们有能力,有信心做好,我们一定要…(中间省略 20 分钟的讲话,如果你听过领导人的讲话,这个你应该能够续上)”动员工作做完了,那就开始压任务了,“这次时间是非常紧张的,只有一个星期的时间,小三,你负责在一个星期的时间把这批 10 万车模(注:

NET设计模式 第二部分 行为型模式(15):模版方法模式(Template Method)

摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Template Method模式 4.适用性及实现要点 概述 变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对.如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识. 意图 定义一个操作中的算法的骨架,而将一些

大话设计模式读书笔记4——模版方法模式

模板方法是一种常见的设计模式,它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. UML图: 具体实现代码: namespace TemplateMethod { class Program { static void Main(string[] args) { AbstractClass A = new ConcreteClassA(); A.TemplateMethod(); AbstractClass B = new

设计模式之行为型模式—— 3.6 模版方法模式

<?php /**  * 3.6 模版方法模式  *  定义:  *  定义一个操作中的算法的骨架,而将一些步骤延  *  迟到子类中.模版方法是的子类可以不改变一个  *  算法的结构即可重定义该算法的某些特定步骤.  *  角色:  *  1. 抽象模版方法类  *  职责:定义并实现了一个模版方法.这个模  *    版方法一般是一个具体方法,它给出  *    了一个顶级逻辑的骨架,而逻辑的组  *    成步骤在相应的抽象操作中,推迟到  *    子类实现.顶级逻辑也有可能调用一  

设计模式之模版方法模式

1.模版方法模式简介: a.模版方法模式的简单介绍: -  模版方法模式是编程中经常用到模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提上重新定义该算法的某些特定步骤. b.核心:处理某个流程中的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用模版方法模式,将这个节点的代码实现转移给子类中完成.即:处理步骤父类中定义好,具体实现延迟到子类中定义. 2.简单的代码演示: 在 BankTemplateMethod 类中添加

JS常用的设计模式(10)——模版方法模式

模式方法是预先定义一组算法,先把算法的不变部分抽象到父类,再将另外一些可变的步骤延迟到子类去实现.听起来有点像工厂模式( 非前面说过的简单工厂模式 ). 最大的区别是,工厂模式的意图是根据子类的实现最终获得一种对象. 而模版方法模式着重于父类对子类的控制. 按GOF的描叙,模版方法导致一种反向的控制结构,这种结构有时被称为“好莱坞法则”,即“别找我们,我们找你”.这指的是一个父类调用一个子类的操作,而不是相反. 一个很常用的场景是在一个公司的项目中,经常由架构师搭好架构,声明出抽象方法.下面的程