设计模式之装饰者模式
本文章需要的基础知识:继承,多态,工厂模式。
场景:可以任意加配料的咖啡,能输出咖啡名和价格。
原理:叠加,组合。
所有的咖啡都能输出咖啡名和价格,那么名字和价格设为虚函数应该没问题。即我们要有个抽象基类包含名字,价格这2个函数,那不就是water么!!
water
{
virtual PrintDescription();
virtual GetValue();
}
白咖啡,黑咖啡,红咖啡 区别是什么?描述不一样,价格不一样,因此咖啡就形成了工厂模式了。
RedCoffe:water
{
string description;
int value;
PrintDescription();
GetValue();
}
WhiteCoffe:water
{
string description;
int value;
PrintDescription();
GetValue();
}
.........
现在要加配料?我们需要实现糖,盐,牛奶等等配料(这又是工厂模式吧)
看一个向一杯白咖啡先加糖,再加盐,再加牛奶的情形。
加糖的时候往哪里加? 往白咖啡里面加。
加盐的时候往哪里加?往带糖的白咖啡里面加。
加牛奶的时候往哪里加?往带糖,盐的白咖啡里面加。
说明配料构造的时候需要目标 ---> 构造函数需要参数,具体参数是什么呢 ?? 这个例子里面是白咖啡,假如目标是黑咖啡呢 ? 所以参数必须设为各种咖啡的老爸,也就是water了。
配料构造成功后 还能能作为(目标)传递下去,说明 构造成功后 还是 water --> 配料继承于water类。。
现在矛盾了啊,咖啡 和 盐,糖,牛奶(等配料) 怎么成了一个东西??
唉,我前面不是一直在说配料构造需要目标,配料继承与water么,我可以定义一个配料类啊
于是
Ingredient : water
{
water *aim;
Ingredient(water * p) : aim(p)
{
};
}
然后盐,糖,牛奶就是以ingredient为基类的工厂模式。
总结: