#include <iostream> #include <memory> // 提供智能指针的定义和实现 // 抽象组件类:咖啡 class Coffee { public: virtual ~Coffee() {} // 获取咖啡描述的方法,纯虚函数 virtual std::string getDescription() const = 0; // 获取咖啡价格的方法,纯虚函数 virtual double cost() const = 0; }; // 具体组件类:基本咖啡 class BasicCoffee : public Coffee { public: // 实现获取描述的方法 std::string getDescription() const override { return "Basic Coffee"; } // 实现获取价格的方法 double cost() const override { return 5.0; // 基本咖啡的价格 } }; // 抽象装饰器类:咖啡装饰器 class CoffeeDecorator : public Coffee { protected: // 持有一个指向被装饰对象的指针 std::shared_ptr<Coffee> coffee; public: // 构造函数,接受一个被装饰对象的指针 CoffeeDecorator(std::shared_ptr<Coffee> coffee) : coffee(coffee) {} // 实现获取描述的方法,调用被装饰对象的方法 std::string getDescription() const override { return coffee->getDescription(); } // 实现获取价格的方法,调用被装饰对象的方法 double cost() const override { return coffee->cost(); } }; // 具体装饰器类:牛奶装饰器 class MilkDecorator : public CoffeeDecorator { public: // 构造函数,接受一个被装饰对象的指针 MilkDecorator(std::shared_ptr<Coffee> coffee) : CoffeeDecorator(coffee) {} // 实现获取描述的方法,添加牛奶的描述 std::string getDescription() const override { return coffee->getDescription() + ", Milk"; } // 实现获取价格的方法,添加牛奶的价格 double cost() const override { return coffee->cost() + 1.5; // 牛奶的价格 } }; // 具体装饰器类:糖装饰器 class SugarDecorator : public CoffeeDecorator { public: // 构造函数,接受一个被装饰对象的指针 SugarDecorator(std::shared_ptr<Coffee> coffee) : CoffeeDecorator(coffee) {} // 实现获取描述的方法,添加糖的描述 std::string getDescription() const override { return coffee->getDescription() + ", Sugar"; } // 实现获取价格的方法,添加糖的价格 double cost() const override { return coffee->cost() + 0.5; // 糖的价格 } }; int main() { // 创建一个基本咖啡对象 std::shared_ptr<Coffee> basicCoffee = std::make_shared<BasicCoffee>(); std::cout << "Description: " << basicCoffee->getDescription() << ", Cost: " << basicCoffee->cost() << " RMB" << std::endl; // 用牛奶装饰基本咖啡 std::shared_ptr<Coffee> coffeeWithMilk = std::make_shared<MilkDecorator>(basicCoffee); std::cout << "Description: " << coffeeWithMilk->getDescription() << ", Cost: " << coffeeWithMilk->cost() << " RMB" << std::endl; // 再用糖装饰已加牛奶的咖啡 std::shared_ptr<Coffee> coffeeWithMilkAndSugar = std::make_shared<SugarDecorator>(coffeeWithMilk); std::cout << "Description: " << coffeeWithMilkAndSugar->getDescription() << ", Cost: " << coffeeWithMilkAndSugar->cost() << " RMB" << std::endl; return 0; }