小话设计模式五:模板方法模式

模板方法模式定义:

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

模板方法解析:

  模板方法模式是比较简单的一种设计模式,但是它却是代码复用的一项基本的技术,在类库中尤其重要,它遵循“抽象类应当拥有尽可能多的行为,应当拥有尽可能少的数据”的重构原则。作为模板的方法要定义在父类中,在方法的定义中使用到抽象方法,而只看父类的抽象方法是根本不知道怎样处理的,实际做具体处理的是子类,在子类中实现具体功能,因此不同的子类执行将会得出不同的实现结果,但是处理流程还是按照父类定制的方式。这就是模板方法的要义所在,制定算法骨架,让子类具体实现。 

  UML图如下:

  简单示例代码如下:

//人类基类
class Person
{
public:
    virtual ~Person(){};
    void eatFood();
protected:
    Person(){}
    virtual void eatBreakfast() = 0;
    virtual void eatLunch() = 0;
    virtual void eatSupper() = 0;
};

void Person::eatFood()  //一天吃饭顺序是固定的,先吃早餐,再吃午餐,最后吃晚餐,但是吃的东西确实不同人有不同的吃法
{
    eatBreakfast();
    eatLunch();
    eatSupper();
}

//胖子
class FatPerson : public Person
{
protected:
    virtual void eatBreakfast();
    virtual void eatLunch();
    virtual void eatSupper();
};

void FatPerson::eatBreakfast()
{
    cout<<"早餐:不吃"<<endl;
}

void FatPerson::eatLunch()
{
    cout<<"午餐:一碗白饭加青菜"<<endl;
}

void FatPerson::eatSupper()
{
    cout<<"晚餐:一个苹果"<<endl;
}

//瘦子
class ThinPerson : public Person
{
protected:
    virtual void eatBreakfast();
    virtual void eatLunch();
    virtual void eatSupper();
};

void ThinPerson::eatBreakfast()
{
    cout<<"早餐:一杯牛奶加一个汉堡"<<endl;
}

void ThinPerson::eatLunch()
{
    cout<<"午餐:两碗白饭加两荤一素"<<endl;
}

void ThinPerson::eatSupper()
{
    cout<<"晚餐:一碗白饭加青菜外加一个苹果"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    Person *pPerson = new ThinPerson;
    pPerson->eatFood();
    delete pPerson;

    return 0;
}
posted @ 2012-11-05 20:40  venow  阅读(364)  评论(0编辑  收藏  举报