大话设计模式C++版本-03-装饰模式

简介: 大话设计模式C++版本-03-装饰模式

概念

装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

允许向一个现有的对象添加新的功能,同时又不改变其结构

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。


应用场景

  1. 在不想增加很多子类的情况下扩展类。
  2. 动态增加功能,动态撤销。


一般步骤

定义一个基类,并带有一个功能的函数。如:Person类里有个Show()功能;

class Person
{
public:
  Person(){};
  Person(string name)
  {
    this->name = name;
  }
  ~Person() {}
  virtual void Show() // 展示装扮
  {
    cout << "装扮的" << name <<  endl;
  }
private:
  string name;
};

定义一个装饰类,继承前面的基类,并且有一个装饰的函数可以装饰基类的指针,且重写基类的那个功能函数(Show),并在函数里调用基类的功能函数(Show);

这一步非常关键,是这个模式里最重要的一步

class Finery : public Person // 装饰类
{
public:
  void Decorate(Person* person) // 装扮指定的人,在这个模式里最重要的一个函数
  {
    boy = person;
  }
  void Show()
  {
    if (boy)
    {
      boy->Show();
    }
  }
private:
  Person* boy;
};

定义具体的功能类,继承前面的装饰类,且重写功能函数(Show);

class TShirt : public Finery
{
public:
  void Show()
  {
    printf("Tshirt ");
    Finery::Show();
  }
};
class BigTrouser : public Finery
{
public:
  void Show()
  {
    printf("BigTrouser ");
    Finery::Show();
  }
};

完整实例

#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
  Person(){};
  Person(string name)
  {
    this->name = name;
  }
  ~Person() {}
  virtual void Show() // 展示装扮
  {
    cout << "装扮的" << name <<  endl;
  }
private:
  string name;
};
class Finery : public Person // 装饰类
{
public:
  void Decorate(Person* person) // 装扮指定的人,在这个模式里最重要的一个函数
  {
    boy = person;
  }
  void Show()
  {
    if (boy)
    {
      boy->Show();
    }
  }
private:
  Person* boy;
};
class TShirt : public Finery
{
public:
  void Show()
  {
    printf("Tshirt ");
    Finery::Show();
  }
};
class BigTrouser : public Finery
{
public:
  void Show()
  {
    printf("BigTrouser ");
    Finery::Show();
  }
};
int main()
{
  Person *xc = new Person("小菜");
  cout << "第一钟装扮" << endl;
  TShirt *tshirt = new TShirt();
  BigTrouser  *BigTrouser  = new BigTrouser();
  tshirt->Decorate(xc);  // 用T恤装扮小菜
  BigTrouser->Decorate(tshirt); // 用裤子 装扮 "已装扮了T恤" 的小菜
  BigTrouser->Show();
  return 0;
}

参考资料

程杰老师的《大话设计模式

装饰器模式|菜鸟教程

目录
相关文章
|
8月前
|
C++
二叉树进阶面试题(精华总结)【C++版本】
二叉树进阶面试题(精华总结)【C++版本】
|
8月前
|
设计模式 PHP
php设计模式--装饰模式(七)装饰模式完成文章编辑
php设计模式--装饰模式(七)装饰模式完成文章编辑
50 0
|
8月前
|
设计模式 中间件 程序员
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
432 3
|
3月前
|
Linux 编译器 测试技术
【C++】CentOS环境搭建-快速升级G++版本
通过上述任一方法,您都可以在CentOS环境中高效地升级G++至所需的最新版本,进而利用C++的新特性,提升开发效率和代码质量。
240 64
|
3月前
|
Linux 编译器 测试技术
【C++】CentOS环境搭建-快速升级G++版本
通过上述任一方法,您都可以在CentOS环境中高效地升级G++至所需的最新版本,进而利用C++的新特性,提升开发效率和代码质量。
284 63
|
5月前
|
设计模式 Java
【八】设计模式~~~结构型模式~~~装饰模式(Java)
文章详细介绍了装饰模式(Decorator Pattern),这是一种对象结构型模式,用于在不使用继承的情况下动态地给对象添加额外的职责。装饰模式通过关联机制,使用装饰器类来包装原有对象,并在运行时通过组合的方式扩展对象的行为。文章通过图形界面构件库的设计案例,展示了装饰模式的动机、定义、结构、优点、缺点以及适用场景,并提供了Java代码实现和应用示例。装饰模式提高了系统的灵活性和可扩展性,适用于需要动态、透明地扩展对象功能的情况。
【八】设计模式~~~结构型模式~~~装饰模式(Java)
|
6月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
53 3
|
6月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
78 2
|
5月前
|
缓存 C++ Windows
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
|
7月前
|
Linux vr&ar C语言
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
415 2