`

模板方法模式(Template)

 
阅读更多
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理.

钩子(hook):是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。

要点:
1.“模板方法“定义了算法的步骤,把这些步骤的实现延迟到子类
2.模板方法模式为我们提供了一种代码复用的重要技巧
3.模板方法的抽象类可以定义具体方法,抽象方法和钩子
4.抽象方法由子类实现
5.钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它
6.为了防止子类改变模板方法中的算法,可以将模板方法声明为const
7.好莱坞原则告诉我们,将决策权放在高层模块中,以便决定如何以及何时调用低层模块
8.策略模式和模板方法模式都封装算法,一个用组合,一个用继承
9.工厂方法是模板方法的一种特殊版本

设计原则:
别找我,我会找你,由超类主控一切,当它们需要的时候,自然会去调用子类,这就跟好莱坞一样



CaffeineBeverage.h
#ifndef CAFFEINEBEVERAGE_H
#define CAFFEINEBEVERAGE_H
#include <iostream>
using namespace std;
class CaffeineBeverage{
public:
    virtual void boilWater()const{
        cout << "boil water" << endl;
    }
    virtual void brew()const=0;
    virtual void pourInCup()const{
        cout << "pour in cup" << endl;
    }
    virtual void addCondiments()const=0;
    //this is a hook
    virtual bool needCondiments(){
        return true;
    }
    void prepareRecipe(){
        boilWater();
        brew();
        pourInCup();
        if(needCondiments()){
            addCondiments();
        }
    }
};

#endif // CAFFEINEBEVERAGE_H



Coffee.h
#ifndef COFFEE_H
#define COFFEE_H
#include "CaffeineBeverage.h"

class Coffee:public CaffeineBeverage{
public:
    void brew()const{
        cout << "Dripping Coffee through filter" << endl;
    }
    void addCondiments()const{
        cout << "Adding sugar" << endl;
    }
};

#endif // COFFEE_H



#ifndef TEA_H
#define TEA_H
#include "CaffeineBeverage.h"
#include <string>
class Tea:public CaffeineBeverage{
public:
    void brew()const{
        cout << "steeping the tea" << endl;
    }
    void addCondiments()const{
        cout << "Adding Lemond" << endl;
    }
    bool needCondiments(){
        string t;
        cout << "Need a Lemond?Y:N" << endl;
        cin >> t ;
        if(t=="y"||t=="Y")
            return true;
        return false;
    }
};

#endif // TEA_H



main.cpp
#include "CaffeineBeverage.h"
#include "Coffee.h"
#include "Tea.h"

int main()
{
    CaffeineBeverage* cb = new Tea;
    cb->prepareRecipe();
    cb = new Coffee;
    cb->prepareRecipe();
}

boil water
steeping the tea
pour in cup
Need a Lemond?Y:N
N
Adding Lemond
boil water
Dripping Coffee through filter
pour in cup
Adding sugar





来个简化版:

class Interface
{
public:
    virtual void method0()=0;
    void method1(){};
    void method2(){};
    void method3(){};
    void method4(){};
};

class A:public Interface
{
    void method0(){}
};

class Model
{
public:
    Model(){
        m = new A;
    }

    ~Model(){}

    void run()
    {
        m->method0();
        m->method1();
        m->method2();
        m->method3();
        m->method4();
    }
private:
    Interface* m;
};


int main()
{
    Model model;
    model.run();
}

  • 大小: 39.9 KB
分享到:
评论

相关推荐

    Head First 设计模式 (八) 模板方法模式(Template Method pattern) C++实现

    模板方法模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在C++这样的面向对象编程语言中。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的...

    设计模式C++学习之模板方法模式(Template Method)

    模板方法模式(Template Method)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这个模式在C++编程中有着...

    模版方法模式TemplatePattern

    模板方法模式(Template Pattern)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。这种模式允许子类重新定义或改变某些基本操作,但整体结构和顺序保持不变。在Java编程中,...

    设计模式之模板方法(Template)

    模板方法设计模式是一种行为设计模式,它在面向对象编程中扮演着重要的角色。这个模式的主要目的是定义一个操作的框架,允许子类在不改变整体结构的情况下重定义具体步骤。这有助于保持代码的整洁,实现代码复用,并...

    设计模式-模板方法模式ppt

    - **抽象类(Abstract Class)**:包含一个或多个抽象方法,并且有一个模板方法(template method)。模板方法通常被声明为final,这意味着它不能被子类覆盖。 - **具体操作(Concrete Operations)**:在抽象类中...

    模板方法模式案例代码

    4. **模板方法(Template Method)**:定义了算法的基本步骤,调用各个步骤的方法,可以是抽象的也可以是具体的方法。 下面是一个简单的Java模板方法模式示例,以饮料制作过程为例: ```java public abstract ...

    设计模式--模板方法模式java例子

    模板方法模式是设计模式中行为型模式的一种,它在软件工程中扮演着非常重要的角色,尤其是在Java编程中。模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。它允许子类不改变一个算法的结构即可重...

    模板方法模式(TemplateMethod)原理图

    模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 具体来说,模板方法模式的关键特点包括: 抽象类:在抽象类中定义一个模板方法,该方法给出了算法的框架。 具体...

    设计模式之模板方法模式

    3. **模板方法(Template Method)**:在抽象类中定义的,它是一个具体方法,负责组织和控制算法的流程。模板方法通常包含了业务逻辑的主要流程,并调用了其他基本方法。 4. **钩子方法(Hook Methods)**:可选的...

    模板方法模式例子

    2. 模板方法(TemplateMethod):这是核心方法,定义了算法的整体结构,调用了抽象方法和具体方法。 3. 具体方法(ConcreteMethod):这些方法在抽象类中已经完全实现,子类不需要关心这部分代码。 例如,假设我们...

    设计模式-模板方法模式(讲解及其实现代码)

    模板方法模式是一种行为设计模式,它允许在定义行为框架的同时,延迟部分具体步骤到子类中实现。这种模式主要用于在父类中定义算法的骨架,而将一些步骤的实现细节留给子类去完成,从而使得不同的子类可以重用相同的...

    Template(模板模式)

    在模板模式中,一个抽象类公开定义了执行它的方法的方式,而将具体实现延迟到子类中。这种方式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板模式的核心结构包括抽象类(AbstractClass)...

    ios-iOS模板方法模式使用心得demo.zip

    4. 模板方法(Template Method):定义了算法的基本结构,包括一系列步骤,这些步骤可能包含直接调用的钩子方法。模板方法通常是不可变的,确保算法的总体流程不会被子类改变。 在iOS应用开发中,模板方法模式的...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合...

    模板模式Template Pattern

    ### 模板模式 (Template Pattern) #### 一、概述 模板模式是一种常用的行为设计模式,其核心在于定义了一个算法的框架,并允许子类提供具体的实现细节。通过这种方式,子类可以继承并重写某些方法,但整个算法的...

    工厂模式及模板方法模式深度思考

    在软件设计模式的世界里,工厂模式和模板方法模式是两种常用的设计模式,它们都有各自的优点和应用场景。这两种模式都是面向对象设计原则的体现,能够帮助我们编写出更加灵活、可扩展的代码。让我们来深入探讨一下这...

    设计模式模板方法模式PPT学习教案.pptx

    首先,我们可以创建一个抽象类`AbstractTestPaper`,其中包含一个模板方法(Template Method),这个方法定义了试题呈现的基本流程,而具体的试题内容则通过钩子方法(Hook Method)来实现。钩子方法在模板方法中被...

    template-method-demo 模板方法示例

    在"template-method-demo"这个示例中,我们可以预见到它将展示如何在Java中应用模板方法模式。这个压缩包可能包含以下内容: 1. 一个抽象类(例如:`AbstractClass`),它定义了模板方法。在这个类中,可能会有一个...

    11.设计模式-模板方法模式1

    模板方法模式(Template Method Pattern)是一种行为设计模式,它允许在父类中定义算法的框架,然后由子类提供具体的实现。这种模式的核心是“模板方法”,它在父类中定义了一个操作的步骤顺序,并将某些步骤声明为...

    python 模板方法模式(示例)

    设计模式——模板方法模式模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤使用场景:当不变和可...

Global site tag (gtag.js) - Google Analytics