模板方法模式(Template)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


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

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

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

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

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

[img]http://dl.iteye.com/upload/attachment/511569/c0f28cdc-ee62-37bf-9cd6-431740dfcc57.png[/img]

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();
}
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“模板方法模式(Template)” 的相关文章

solidity学习日记(一)

1.版本指令 所有的 Solidity 源码都必须冠以 “version pragma” — 标明 Solidity 编译器的版本, 以避免将来新的编译器可能破坏代码。 pragma solidity ^0.4.19; 2.合约 solidity所有的代码都包含在合约中&#x...

thinkphp如何删除文件夹 - 编程语言

本篇内容介绍了“thinkphp如何删除文件夹”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 一、删除空文件夹要删除一个空的文件夹,我们可以...

sync,shutdown,usr

sync:同步数据,将内存中的数据刷新到硬盘上,相当于refresh shutdown +10:系统就会10分钟后关机 文件名以.开关是的隐藏文件 usr:UNIX Software Resource...

centos下安装fcitx输入法

在ubuntu下用起来很不错 一、提前解决 Fcitx 的依赖问题 Fcitx,依赖于:gettext, gettext-devel, libXft, libXft-devel, libXpm和libXpm-devel,这六个软件包和一些编译工具与库。 可以...

apche如何去掉index.php - 编程语言

这篇文章主要介绍了apche如何去掉index.php的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇apche如何去掉index.php文章都会有所收获,下面我们一起来看看吧。 Apache是一种流行的Web服...

php如何把特殊字符转义 - 编程语言

今天小编给大家分享一下php如何把特殊字符转义的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 一、什么是特殊字符特殊字符是指...