装饰模式(Decorator Pattern)是一种结构型设计模式,它允许向现有对象动态地添加新功能,同时又不改变其结构。装饰模式通过将对象放入包装器中来实现,在包装器中可以动态地添加功能。
在装饰模式中,通常会有四个角色:
- Component(组件):定义一个对象接口,可以动态地给这些对象添加职责。
- ConcreteComponent(具体组件):实现Component接口,并定义需要被装饰的类。
- Decorator(装饰器):持有一个Component对象的引用,并定义一个与Component接口一致的接口。
- ConcreteDecorator(具体装饰器):扩展Decorator类,覆盖其中的方法,以添加新的功能。
cpp
#include <iostream>
// Component(组件)
class Coffee {
public:
virtual void makeCoffee() = 0;
};
// ConcreteComponent(具体组件)
class SimpleCoffee : public Coffee {
public:
void makeCoffee() override {
std::cout << "Making simple coffee" << std::endl;
}
};
// Decorator(装饰器)
class CoffeeDecorator : public Coffee {
protected:
Coffee* coffee;
public:
CoffeeDecorator(Coffee* coffee) : coffee(coffee) {}
void makeCoffee() override {
if (coffee) {
coffee->makeCoffee();
}
}
};
// ConcreteDecorator(具体装饰器)
class MilkDecorator : public CoffeeDecorator {
public:
MilkDecorator(Coffee* coffee) : CoffeeDecorator(coffee) {}
void makeCoffee() override {
if (coffee) {
coffee->makeCoffee();
addMilk();
}
}
void addMilk() {
std::cout << "Adding milk" << std::endl;
}
};
// ConcreteDecorator(具体装饰器)
class SugarDecorator : public CoffeeDecorator {
public:
SugarDecorator(Coffee* coffee) : CoffeeDecorator(coffee) {}
void makeCoffee() override {
if (coffee) {
coffee->makeCoffee();
addSugar();
}
}
void addSugar() {
std::cout << "Adding sugar" << std::endl;
}
};
int main(int argc, char *argv[])
{
// 创建一个简单的咖啡对象
Coffee* simpleCoffee = new SimpleCoffee();
// 使用装饰器为咖啡添加牛奶
Coffee* milkCoffee = new MilkDecorator(simpleCoffee);
// 制作带牛奶的咖啡
milkCoffee->makeCoffee();
// 使用装饰器为牛奶咖啡添加糖
Coffee* milkSugarCoffee = new SugarDecorator(milkCoffee);
milkSugarCoffee->makeCoffee();
delete simpleCoffee;
delete milkCoffee;
delete milkSugarCoffee;
return 0;
}