您的位置:首页 > 其它

设计模式 -- 模板方法模式 TemplateMethod

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

核心:通过把不变的行为放到基类,去除子类中的重复代码达到复用的目的。但是,具体的步骤已经在基类中写好了,子类只是有不同的实现罢了。

一个小技巧,钩子的使用可以使得算法更灵活。

小例子:喝茶 or 喝咖啡

//基类:饮料
class Beverage {
public:
virtual void prepareRecipe()
{
boilWater();
brew();
pourIntoCup();

//钩子代码:判断是否需要加料,毕竟有些人喜欢喝茶喝咖啡不加任何东东
if(wantCondiments())
{
addCondiments();
}
}

void boilWater() { cout << "煮水" << endl; }
virtual void brew() = 0;
void pourIntoCup() { cout << "把水倒入杯子中" << endl; }
virtual void addCondiments() = 0;

//钩子代码:虚函数,wantCondiments(),子类根据不同需要去实现;默认是true
virtual bool wantCondiments() { return true; }
};

//子类:咖啡
class Coffee : public Beverage {
public:
void brew() { cout << "冲咖啡" << endl; }
void addCondiments() { cout << "加糖和牛奶" << endl; }
bool wantCondiments() { return false; }
};

//子类:茶
class Tea : public Beverage {
public:
void brew() { cout << "泡茶" << endl; }
void addCondiments() { cout << "加柠檬" << endl; }
};

int main()
{
//小米喜欢喝咖啡,不加料
Beverage *xiaomiCoffee = new Coffee();
xiaomiCoffee->prepareRecipe();
cout << endl;

//大米喜欢喝茶,加料
Beverage *damiTea = new Tea();
damiTea->prepareRecipe();
return 0;
}
/*
煮水
冲咖啡
把水倒入杯子中

煮水
泡茶
把水倒入杯子中
加柠檬
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: