当前位置: 首页 > news >正文

C++ 设计模式-装饰器模式

C++ 装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不修改现有类的情况下动态地给一个对象添加一些额外的职责。装饰模式通常用来扩展功能,特别是在不希望通过继承的方式来改变类时,它可以通过“装饰”原始对象来增加行为。

经典示例:图形界面控件的装饰

简单的图形接口和多个实现类,例如 CircleRectangle,可以使用装饰模式来增加一些功能,比如绘制时增加边框、阴影等,而不修改原始的图形类。

1. 代码示例

#include <iostream>
#include <memory>

// 组件接口
class Shape {
public:
    virtual ~Shape() = default;
    virtual void draw() const = 0;
};

// 具体组件类:Circle
class Circle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a Circle" << std::endl;
    }
};

// 具体组件类:Rectangle
class Rectangle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a Rectangle" << std::endl;
    }
};

// 装饰器基类
class ShapeDecorator : public Shape {
protected:
    std::shared_ptr<Shape> wrappedShape;  // 被装饰的对象

public:
    explicit ShapeDecorator(std::shared_ptr<Shape> shape) : wrappedShape(std::move(shape)) {}
    virtual void draw() const override {
        wrappedShape->draw();
    }
};

// 具体装饰类:BorderDecorator
class BorderDecorator : public ShapeDecorator {
public:
    explicit BorderDecorator(std::shared_ptr<Shape> shape) : ShapeDecorator(std::move(shape)) {}

    void draw() const override {
        ShapeDecorator::draw();
        std::cout << "Adding Border" << std::endl;
    }
};

// 具体装饰类:ShadowDecorator
class ShadowDecorator : public ShapeDecorator {
public:
    explicit ShadowDecorator(std::shared_ptr<Shape> shape) : ShapeDecorator(std::move(shape)) {}

    void draw() const override {
        ShapeDecorator::draw();
        std::cout << "Adding Shadow" << std::endl;
    }
};

// 测试代码
int main() {
    // 创建一个基本的 Circle
    std::shared_ptr<Shape> circle = std::make_shared<Circle>();
    std::cout << "Basic Circle:" << std::endl;
    circle->draw();
    std::cout << std::endl;

    // 给 Circle 增加边框
    std::shared_ptr<Shape> borderedCircle = std::make_shared<BorderDecorator>(circle);
    std::cout << "Circle with Border:" << std::endl;
    borderedCircle->draw();
    std::cout << std::endl;

    // 给 Circle 增加阴影
    std::shared_ptr<Shape> shadowedCircle = std::make_shared<ShadowDecorator>(circle);
    std::cout << "Circle with Shadow:" << std::endl;
    shadowedCircle->draw();
    std::cout << std::endl;

    // 给 Circle 增加边框和阴影
    std::shared_ptr<Shape> decoratedCircle = std::make_shared<ShadowDecorator>(borderedCircle);
    std::cout << "Circle with Border and Shadow:" << std::endl;
    decoratedCircle->draw();
    std::cout << std::endl;

    return 0;
}

2. 解释

  • Shape:这是一个抽象接口,定义了 draw() 方法,所有具体的图形(如 CircleRectangle)都继承自它。
  • CircleRectangle:这些是具体的图形类,直接实现了 Shape 接口的 draw() 方法,表示如何绘制一个圆形或矩形。
  • ShapeDecorator:这是装饰器基类,它也实现了 Shape 接口,并持有一个 Shape 指针(即被装饰的对象)。它的 draw() 方法会委托给被装饰的 Shape 对象的 draw() 方法。
  • BorderDecoratorShadowDecorator:这两个类是具体的装饰器,分别在原始图形的 draw() 方法基础上增加了“边框”和“阴影”功能。

3. 测试输出

Basic Circle:
Drawing a Circle

Circle with Border:
Drawing a Circle
Adding Border

Circle with Shadow:
Drawing a Circle
Adding Shadow

Circle with Border and Shadow:
Drawing a Circle
Adding Border
Adding Shadow

4. 总结

在这个例子中,通过装饰器模式能在不修改原始 CircleRectangle 类的情况下,灵活地为它们增加边框或阴影等额外的功能。每个装饰器类都是 ShapeDecorator 的一个具体实现,它封装了一个 Shape 对象并在其原有功能上增加新的功能。

装饰模式的优势在于它能非常灵活地组合不同的装饰,而无需修改原有代码,使得代码更具扩展性和可维护性。

相关文章:

  • 第四篇:放大电路的“子弹时间”——车载音频与传感器信号链设计
  • oppo,康冠科技25届春招内推
  • 5种解决方式来应对deepseek暂时无法回答
  • 使用 YOLOv8 模型分析摄像头的图像
  • Python+wxauto:实现电脑端微信程序自动化
  • 深入理解 ABA 问题与退让策略:Go 语言实现与优化
  • 【黑马点评】 使用RabbitMQ实现消息队列——3.批量获取1k个用户token,使用jmeter压力测试
  • Conda 包管理:高效安装、更新和删除软件包
  • Ae:常见的光照控件和材质控件
  • Git 查看修改记录 二
  • BGA 封装工艺简介
  • 怎么保证设计的API是安全的
  • Leetcode 139. 单词拆分
  • 权重修剪(Pruning)和量化(Quantization)
  • Rust学习总结之结构体(一)
  • 【第3章:卷积神经网络(CNN)——3.4 MNIST手写数字识别】
  • SonarQube
  • JavaScript 网页设计案例:经典与创新的完美结合
  • DNS污染、劫持频发?HTTPDNS让安全无死角
  • C++从入门到实战(四)C++引用与inline,nullptr
  • 做网站的网站/2023广东又开始疫情了吗
  • 权4网站怎么做/北京网站优化对策
  • 江苏省政府门户网站建设的调查报告/百度知道客服电话
  • 视频网站可以做B2C模式吗/北京网络营销公司哪家好
  • 做素材网站存储/个人代运营一般怎么收费
  • 如何学做网站外包/百分百营销软件