装饰器模式(C++)

**定义:**装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于对象结构型模式,它是通过创建一个包装对象,也就是装饰器,来包裹真实的对象。

代码:

cpp 复制代码
// 抽象构件角色  
class Component {  
public:  
    virtual ~Component() = default;  
    virtual void Operation() const = 0;  
};  
  
// 具体构件角色  
class ConcreteComponent : public Component {  
public:  
    void Operation() const override {  
        std::cout << "ConcreteComponent" << std::endl;  
    }  
};  
  
// 抽象装饰器角色  
class Decorator : public Component {  
protected:  
    std::shared_ptr<Component> component;  
  
public:  
    Decorator(std::shared_ptr<Component> comp) : component(comp) {}  
    void Operation() const override {  
        component->Operation();  
    }  
};  
  
// 具体装饰器角色A  
class ConcreteDecoratorA : public Decorator {  
public:  
    ConcreteDecoratorA(std::shared_ptr<Component> comp) : Decorator(comp) {}  
    void Operation() const override {  
        Decorator::Operation(); // 调用被装饰对象的Operation()  
        AddedBehavior();        // 调用附加行为  
    }  
    void AddedBehavior() const {  
        std::cout << "ConcreteDecoratorA - Added Behavior" << std::endl;  
    }  
};  
  
// 具体装饰器角色B  
class ConcreteDecoratorB : public Decorator {  
public:  
    ConcreteDecoratorB(std::shared_ptr<Component> comp) : Decorator(comp) {}  
    void Operation() const override {  
        AddedBehavior();        // 调用附加行为  
        Decorator::Operation(); // 调用被装饰对象的Operation()  
    }  
    void AddedBehavior() const {  
        std::cout << "ConcreteDecoratorB - Added Behavior" << std::endl;  
    }  
};  
  
int main() {  
    // 创建具体构件对象  
    auto concreteComponent = std::make_shared<ConcreteComponent>();  
  
    // 创建装饰器对象并装饰具体构件对象  
    auto decoratorA = std::make_shared<ConcreteDecoratorA>(concreteComponent);  
    auto decoratorB = std::make_shared<ConcreteDecoratorB>(decoratorA);  
  
    // 执行被装饰后的对象的方法  
    decoratorB->Operation();  
  
    return 0;  
}
相关推荐
理论最高的吻12 分钟前
98. 验证二叉搜索树【 力扣(LeetCode) 】
数据结构·c++·算法·leetcode·职场和发展·二叉树·c
沈小农学编程17 分钟前
【LeetCode面试150】——202快乐数
c++·python·算法·leetcode·面试·职场和发展
ZZZ_O^O30 分钟前
【动态规划-卡特兰数——96.不同的二叉搜索树】
c++·学习·算法·leetcode·动态规划
机器视觉知识推荐、就业指导1 小时前
C++设计模式:原型模式(Prototype)
c++·设计模式·原型模式
feiyangqingyun1 小时前
Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
c++·qt·qt天地图·qt离线地图·qt地图导航
MinBadGuy2 小时前
【GeekBand】C++设计模式笔记13_Flyweight_享元模式
c++·设计模式
一子二木生三火2 小时前
IO流(C++)
c语言·开发语言·数据结构·c++·青少年编程
谁在夜里看海.2 小时前
【从零开始的算法学习日记✨优选算法篇✨】第二章:流动之窗,探索算法的优雅之道
c++·学习·算法
菠菠萝宝2 小时前
【YOLOv8】安卓端部署-1-项目介绍
android·java·c++·yolo·目标检测·目标跟踪·kotlin
初晴~3 小时前
【spring】参数校验Validation
java·c++·spring boot·后端·python·spring·validation