结构型模式——装饰模式

装饰设计模式适用于以下情况:

• 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;

下面是一个装饰模式的示例程序:

cpp 复制代码
#include <iostream>
#include <string>
#include <memory>

// Step 1: The Component Interface
class Coffee {
public:
    virtual ~Coffee() = default;
    virtual std::string getDescription() const = 0;
    virtual double getCost() const = 0;
};

// Step 2: Concrete Component (The plain object we want to decorate)
class SimpleCoffee : public Coffee {
public:
    std::string getDescription() const override {
        return "Simple Coffee";
    }
    
    double getCost() const override {
        return 2.00; // Base price $2.00
    }
};

// Step 3: The Base Decorator
// It maintains a pointer to a wrapped Coffee object and matches its interface
class CoffeeDecorator : public Coffee {
protected:
    std::unique_ptr<Coffee> wrappedCoffee_;

public:
    CoffeeDecorator(std::unique_ptr<Coffee> coffee) : wrappedCoffee_(std::move(coffee)) {}
    
    std::string getDescription() const override {
        return wrappedCoffee_->getDescription();
    }
    
    double getCost() const override {
        return wrappedCoffee_->getCost();
    }
};

// Step 4: Concrete Decorator A (Adds Milk)
class MilkDecorator : public CoffeeDecorator {
public:
    MilkDecorator(std::unique_ptr<Coffee> coffee) : CoffeeDecorator(std::move(coffee)) {}

    std::string getDescription() const override {
        // Delegate to the wrapped object, then add milk description
        return CoffeeDecorator::getDescription() + ", Milk";
    }

    double getCost() const override {
        // Delegate to the wrapped object, then add milk cost
        return CoffeeDecorator::getCost() + 0.50;
    }
};

// Step 5: Concrete Decorator B (Adds Sugar)
class SugarDecorator : public CoffeeDecorator {
public:
    SugarDecorator(std::unique_ptr<Coffee> coffee) : CoffeeDecorator(std::move(coffee)) {}

    std::string getDescription() const override {
        return CoffeeDecorator::getDescription() + ", Sugar";
    }

    double getCost() const override {
        return CoffeeDecorator::getCost() + 0.25;
    }
};

// Client Code
int main() {
    std::cout << "--- Ordering Custom Coffees ---\n";

    // 1. Order a completely plain coffee
    std::unique_ptr<Coffee> myCoffee = std::make_unique<SimpleCoffee>();
    std::cout << myCoffee->getDescription() << " costs: $" << myCoffee->getCost() << "\n";

    // 2. Wrap it with Milk at runtime
    myCoffee = std::make_unique<MilkDecorator>(std::move(myCoffee));
    std::cout << myCoffee->getDescription() << " costs: $" << myCoffee->getCost() << "\n";

    // 3. Wrap it with Sugar as well
    myCoffee = std::make_unique<SugarDecorator>(std::move(myCoffee));
    std::cout << myCoffee->getDescription() << " costs: $" << myCoffee->getCost() << "\n";

    // 4. Create a pre-configured double-milk coffee from scratch
    std::unique_ptr<Coffee> premiumCoffee = std::make_unique<SugarDecorator>(
        std::make_unique<MilkDecorator>(
            std::make_unique<MilkDecorator>(
                std::make_unique<SimpleCoffee>()
            )
        )
    );
    std::cout << "\nPremium Order:\n" << premiumCoffee->getDescription() << " costs: $" << premiumCoffee->getCost() << "\n";

    return 0;
}

程序运行结果如下:

shell 复制代码
$ g++ -o main main.cpp
$ ./main
--- Ordering Custom Coffees ---
Simple Coffee costs: $2
Simple Coffee, Milk costs: $2.5
Simple Coffee, Milk, Sugar costs: $2.75

Premium Order:
Simple Coffee, Milk, Milk, Sugar costs: $3.25
相关推荐
冻柠檬飞冰走茶9 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
wangchen_09 小时前
C++正则表达式
开发语言·c++·正则表达式
码匠许师傅11 小时前
【C++ 面试真题】聊聊 C++ 中的 lambda 表达式
java·c++·面试
依然鸣11 小时前
PTA团体程序设计天梯赛L1真题讲解L1-085-088
数据结构·c++·经验分享·算法·深度优先·pat考试
workflower12 小时前
案例 :某交通厅基于AI技术的智能安全运营实践
网络·人工智能·安全·设计模式·机器人
沙盘客12 小时前
AFSIM 14篇 C++ 插件开发:扩展你的仿真能力
c++·后端
NeilYuen12 小时前
【vemory】高性能KV存储AOF方案设计
linux·c++·redis·缓存
王老师青少年编程14 小时前
2021年CSP-J初赛真题及答案解析(完善程序2)
c++·真题·csp-j·答案·csp·初赛·信奥赛
有点。14 小时前
C++二叉树(一)
开发语言·数据结构·c++
晚风叙码14 小时前
深入理解红黑树:从原理到C++实现与可视化
开发语言·数据结构·c++