【发布时间】:2019-04-02 06:29:05
【问题描述】:
我正在尝试c++ 中的装饰器设计模式。但是,如果没有核心类和装饰类都继承自的抽象超类,我就无法实现它。
我不明白为什么需要抽象超类。
我的工作装饰器示例:
#include <string>
#include <iostream>
using namespace std;
// abstract superclass
class Pizza
{
public:
virtual string GetDescription() = 0;
virtual int GetCost() = 0;
};
// base class that can be extended
class Margharita: public Pizza
{
private:
string description;
int cost;
public:
Margharita(string t, int c){description = t; cost = c;}
string GetDescription(){return(description);}
int GetCost(){return(cost);}
};
// decorator class that extends base class
class ExtraCheese: public Pizza
{
private:
Pizza* pizza;
public:
// constructor
ExtraCheese(Pizza* p) {pizza = p;}
string GetDescription() { return (pizza->GetDescription() + ", Extra Cheese"); }
int GetCost() { return(pizza->GetCost() + 20); }
};
int main()
{
// create decorated object
Pizza* pizza = new ExtraCheese(new Margharita("Margharita", 100));
cout << pizza->GetDescription() << '\n';
cout << pizza->GetCost() << '\n';
}
给出输出:Margharita, Extra Cheese 120。
如果我删除抽象超类,装饰将停止工作:
#include <string>
#include <iostream>
using namespace std;
// base class that can be extended
class Pizza
{
private:
string description;
int cost;
public:
Pizza(){description = "Pizza"; cost = 100;};
string GetDescription(){return(description);}
int GetCost(){return(cost);}
};
// decorator class that extends base class
class ExtraCheese: public Pizza
{
private:
Pizza* pizza;
public:
// constructor
ExtraCheese(Pizza* p) {pizza = p;}
string GetDescription() { return (pizza->GetDescription() + ", Extra Cheese"); }
int GetCost() { return(pizza->GetCost() + 20); }
};
int main()
{
// create decorated object
Pizza* pizza = new ExtraCheese(new Pizza());
cout << pizza->GetDescription() << '\n';
cout << pizza->GetCost() << '\n';
}
在这种情况下,输出仅显示核心对象 (Pizza 100) 的属性。
为什么会这样?
【问题讨论】:
-
GetDescription不是虚拟的 -
无论哪种情况,这种设计都表现出一些怪异之处。 “ExtraCheese”不是披萨,但它继承自那个类?或者,如果您说“ExtraCheese”是披萨,那为什么它还包含披萨?更好的设计是完全放弃继承,让 Pizza 只包含一个 Toppings 列表。
-
确实如此。我的开发技能仍然主要受限于避免编译错误。但是,我认为装饰器的设计原则主要是在浇头发生变化时不更改核心类的代码,这不是您的建议。
标签: c++ design-patterns decorator