模板方法模式(Template Method Pattern)

抽象模版(AbstractClass角色:

定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。定义并实现了一个模版方法。这个模版方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。这个就是定义了我们的固定的操作顺序。

具体模版(ConcreteClass角色:

实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。每一个抽象模版角色都可以有任意多个具体模版角色与之对应,而每一个具体模版角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。就是对我们的多个压缩文件的不同的解压缩的支持。

 

#include <iostream>class CaffeineBeverage  //咖啡因饮料
{
public:
    void PrepareRecipe() //咖啡因饮料冲泡法
    {
        BoilWater();  //把水煮沸
        Brew();    //冲泡
        PourInCup();  //把咖啡因饮料倒进杯子
        AddCondiments(); //加调料
    }
    void BoilWater()
    {std::cout << "把水煮沸" << std::endl;}
    virtual void Brew()
    {this->Brew();}
    virtual void PourInCup()
    {std::cout << "把咖啡倒进杯子" << std::endl;}
    void AddCondiments()
    {this->AddCondiments();}
};
class Coffee : public CaffeineBeverage
{ public: void Brew() {std::cout << "用沸水冲泡咖啡" << std::endl;} void AddCondiments() {std::cout << "加糖和牛奶" << std::endl;} }; class Tea : public CaffeineBeverage
{ public: void Brew() {std::cout << "用沸水浸泡茶叶" << std::endl;} void AddCondiments() {std::cout << "加柠檬" << std::endl;} }; int main(void) { std::cout << "冲杯咖啡:" << std::endl; Coffee c; c.PrepareRecipe(); std::cout << std::endl; std::cout << "冲杯茶:" << std::endl; Tea t; t.PrepareRecipe(); return 0; }

 

 

模版方法中的方法可以分为两大类:模版方法(Template Method)和基本方法(Primitive Method)。

模版方法

一个模版方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。这个模版方法一般会在抽象类中定义,并由子类不加以修改地完全继承下来。

基本方法

基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

抽象方法:一个抽象方法由抽象类声明,由具体子类实现。在C#语言里一个抽象方法以abstract关键字标示出来。

具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。在C#语言里面,一个具体方法没有abstract关键字。

钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。(Visual FoxPro中项目向导建立的项目会使用一个AppHook类实现监视项目成员变化,调整系统结构的工作。)钩子方法的名字通常以do开始。

 

posted @ 2013-07-22 22:27  风啊  阅读(120)  评论(0)    收藏  举报