class Beverage {
public:
virtual std::string getDescription() = 0;
virtual double cost() = 0;
virtual ~Beverage() {}
};
class Coffee : public Beverage {
public:
std::string getDescription() override {
return "Coffee";
}
double cost() override {
return 2.0;
}
};
class CondimentDecorator : public Beverage {
protected:
Beverage* beverage;
public:
CondimentDecorator(Beverage* b) : beverage(b) {}
std::string getDescription() override = 0;
double cost() override = 0;
};
class MilkDecorator : public CondimentDecorator {
public:
MilkDecorator(Beverage* b) : CondimentDecorator(b) {}
std::string getDescription() override {
return beverage->getDescription() + ", Milk";
}
double cost() override {
return beverage->cost() + 0.5;
}
};
// 糖装饰器类
class SugarDecorator : public CondimentDecorator {
public:
SugarDecorator(Beverage* b) : CondimentDecorator(b) {}
std::string getDescription() override {
return beverage->getDescription() + ", Sugar";
}
double cost() override {
return beverage->cost() + 0.2;
}
};
在 GUI 开发中,窗口、按钮等基本组件可能需要添加各种额外的功能,如边框样式、背景颜色、鼠标悬停效果等。装饰器模式可以用于在不改变基本组件类的情况下,动态地为这些组件添加各种装饰效果。
例如,一个基本的按钮组件可以通过装饰器类添加发光效果或阴影效果,而无需修改按钮的原始代码。
在 C++ 的输入 / 输出流体系中,装饰器模式被广泛应用。例如,iostream 库中的 istream 和 ostream 类可以被看作是基本组件,而 iostream 库中的很多类(如 ifstream、ofstream、iostream、fstream 等)都是在基本组件的基础上通过装饰器模式添加了不同的功能,如文件读写功能、缓冲功能等。
游戏开发中的角色装备系统
在游戏角色的装备系统中,角色本身具有一些基本属性和能力。当角色装备不同的物品(如武器、盔甲、饰品等)时,可以将这些装备看作是装饰器。每个装备都可以在角色原有能力的基础上增加额外的属性,如攻击力、防御力、速度等,并且这些装备可以组合使用,就像多个装饰器可以依次装饰一个对象一样。
装饰器模式在需要动态扩展对象功能的场景中是一种非常有效的设计模式,但在使用时需要谨慎考虑其复杂性和可能带来的问题。