IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 设计模式之结构型之装饰模式(C++) -> 正文阅读

[C++知识库]设计模式之结构型之装饰模式(C++)

参考资料

1. 概述

名称:装饰模式,装饰者模式,Wrapper,Decorator

装饰设计模式

“套娃模式”?

更好地应对对基本功能的多种扩展,动态完成

如何能更加方便地应对多种方法的任意组合?如何在运行时动态的完成,如果使用继承则是静态的,如果可能的组合的很多,子类的数量将很多

通常使用组合的方式实现

生活中的例子:

装饰模式示例

?UML图

装饰设计模式的结构

?应用场景

  • 希望在运行时为对象新增额外的功能,但是不需要更改设计类的代码,则可以使用装饰模式
  • 如果无法通过继承来扩展功能,则也可以考虑使用装饰模式

实现关键:具体装饰必须在调用父类方法之后或者之前执行自身的行为;装饰基类使用一个成员变量指向被装饰对象的引用

装饰模式的优点:

  • 无需创建新子类就可以扩展对象的行为
  • 可以在运行是添加或者删除对象功能
  • 更加符合单一职责原则,比起实现一个复杂的子类,装饰模式更加符合单一职责原则

缺点:

  • 初始化代码会比较复杂
  • 实现可以任意顺序组合的装饰编码比较困难

一句话总结:装饰模式是一个结构型设计模式,允许你通过将对象放入特殊封装对象来增加新的行为

2. 编码

#include <bits/stdc++.h>
using namespace std;

/**
 * 基本成分的接口
 */
class Component {
 public:
  virtual ~Component() {}
  virtual string Operation() const = 0;
};

/**
 * 具体成分
 */
class ConcreteComponent : public Component {
 public:
  string Operation() const override {
    return "ConcreteComponent";
  }
};

/**
 * 基本装饰器,注意实现了基本成分接口
 */
class Decorator : public Component {
 protected:
  Component* component_;

 public:
  /**
   * @brief 注意这个构造函数
   * @param component 基本成分指针
   */
  Decorator(Component* component) : component_(component) {}

  /**
   * @brief 调用基本成分的功能
   * @return 基本成分操作返回值
   */
  string Operation() const override {
    return component_->Operation();
  }
};

/**
 * 扩展装饰器A
 */
class ConcreteDecoratorA : public Decorator {
 public:
  /**
   * @brief 构造函数会初始化基本装饰器
   * @param component 基本成分指针
   */
  ConcreteDecoratorA(Component* component) : Decorator(component) {}

  /**
   * @brief 注意这里也调用了基本装饰器的操作
   * @return
   */
  string Operation() const override {
    return "ConcreteDecortorA(" + Decorator::Operation() + ")";
  }
};

/**
 * 扩展装饰器B
 */
class ConcreteDecoratorB : public Decorator {
 public:
  /**
   * @brief 构造函数会初始化基本装饰器
   * @param component 基本成分指针
   */
  ConcreteDecoratorB(Component* component) : Decorator(component) {}

  /**
   * @brief 注意这里也调用了基本装饰器的操作
   * @return
   */
  string Operation() const override {
    return "ConcreteDecortorB(" + Decorator::Operation() + ")";
  }
};

void ClientCode(Component* component) {
  cout << "RESULT: " << component->Operation();
}

int main() {
  Component* simple = new ConcreteComponent();
  cout << "Client: I've got a simple component:\n";
  ClientCode(simple);
  cout << "\n\n";

  Component* decorator1 = new ConcreteDecoratorA(simple);
  Component* decorator2 = new ConcreteDecoratorB(decorator1);
  cout << "Client: Now I've got a decorated component:\n";
  ClientCode(decorator2);
  cout << endl;

  delete simple;
  delete decorator1;
  delete decorator2;
  return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:10:21  更:2021-08-21 15:13:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 5:13:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计