小话设计模式五:模板方法模式
模板方法模式定义:
定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法解析:
模板方法模式是比较简单的一种设计模式,但是它却是代码复用的一项基本的技术,在类库中尤其重要,它遵循“抽象类应当拥有尽可能多的行为,应当拥有尽可能少的数据”的重构原则。作为模板的方法要定义在父类中,在方法的定义中使用到抽象方法,而只看父类的抽象方法是根本不知道怎样处理的,实际做具体处理的是子类,在子类中实现具体功能,因此不同的子类执行将会得出不同的实现结果,但是处理流程还是按照父类定制的方式。这就是模板方法的要义所在,制定算法骨架,让子类具体实现。
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; }