模板方法模式是把不变的代码移到超类中,去除子类中的重复代码。 只把动态改变的地方交给子类多态去实现。
代码如下,基类是固定的菜谱,子类实现了A和B各点多少份菜。 A B不关心菜谱有什么,只关心自己应该点多少份。
class Menu
{
public:
Menu();
~Menu();
void OrderPork(){
std::cout << "红烧肉:" << getPorkNum() << "份" << std::endl;
}
void OrderPotato(){
std::cout << "土豆泥:" << getPotatoNum() << "份" << std::endl;
}
void OrderFish(){
std::cout << "水煮鱼:" << getFishNum() << "份" << std::endl;
}
virtual int getPorkNum(){
return 0;
}
virtual int getPotatoNum(){
return 0;
}
virtual int getFishNum(){
return 0;
}
};
#include "Menu.h"
class MenuPersonA :
public Menu
{
public:
MenuPersonA();
~MenuPersonA();
int getPorkNum (){
return 3;
}
int getPotatoNum (){
return 4;
}
int getFishNum(){
return 5;
}
};
#include "Menu.h"
class MenuPersonB :
public Menu
{
public:
MenuPersonB();
~MenuPersonB();
int getPorkNum() override{
return 4;
}
int getPotatoNum()override{
return 1;
}
int getFishNum()override{
return 2;
}
};
客户端调用:
int _tmain(int argc, _TCHAR* argv[])
{
Menu *PersonA = new MenuPersonA();
Menu *PersonB = new MenuPersonB();
PersonA->OrderFish();
PersonA->OrderPork();
PersonA->OrderPotato();
PersonB->OrderFish();
PersonB->OrderPork();
PersonB->OrderPotato();
delete PersonA;
delete PersonB;
return 0;
}