C++设计模式之装饰模式(Decorator)

 更新时间:2018年03月28日 10:59:43   作者:http://www.cnblogs.com/chencarl/p/8649394.html  
这篇文章主要为大家详细介绍了C++设计模式之装饰模式Decorator的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

装饰模式是一种经典的类功能扩展模式,其精髓在装饰类使用继承加聚合的方式获得接口和要实现对象,然后通过自己实现扩展接口

作用
装饰模式通过装饰类动态地将责任附加到对象上,若要扩展功能,无需通过继承增加子类就能扩展对象的新功能,提供了比继承更有弹性的替代方案,避免了子类数量膨胀带来的系统臃肿。

类视图

代码实现

class Component
{
public:
  Component(){}
  virtual ~Component(){}

  virtual void operation() = 0;
};


class ConcreteComponentA : public Component
{
public:
  ConcreteComponentA(){}
  ~ConcreteComponentA(){}

  void operation()
  {
    fprintf(stderr, "ConcreteComponentA's operation!\n");
  }
};

class ConcreteComponentB : public Component
{
public:
  ConcreteComponentB(){}
  ~ConcreteComponentB(){}

  void operation()
  {
    fprintf(stderr, "ConcreteComponentB's operation!\n");
  }
};

class Decorator : public Component
{
public:
  Decorator() :mComponent(NULL){}
  virtual ~Decorator(){}

  virtual void operation()
  {
    if (mComponent)
      mComponent->operation();
  }
  virtual void setComponent(Component* pComponent)
  {
    mComponent = pComponent;
  }

protected:
  Component* mComponent;
};


class ConcreteDecoratorE : public Decorator
{
public:
  ConcreteDecoratorE ();
  virtual ~ConcreteDecoratorE ();

  virtual void addBehavior()
  {
    mComponent->operation();
    fprintf(stderr, "ConcreteDecoratorE's addBehavior!\n");
  }
};

class ConcreteDecoratorF : public Decorator
{
public:
  ConcreteDecoratorF ();
  virtual ~ConcreteDecoratorF ();

  virtual void addBehavior()
  {
    operation();
    fprintf(stderr, "ConcreteDecoratorF's addBehavior!\n");
  }
};


int main()
{
  ConcreteComponentB *pComponent = new ConcreteComponentB();
  ConcreteDecoratorF decorator;
  decorator.setComponent(pComponent);
  decorator.addBehavior();
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++设计模式之观察者模式

    C++设计模式之观察者模式

    这篇文章主要介绍了C++设计模式之观察者模式,本文讲解了什么是观察者模式、观察者模式的UML类图、观察者模式的使用场合等内容,需要的朋友可以参考下
    2014-10-10
  • 使用C语言的fork()函数在Linux中创建进程的实例讲解

    使用C语言的fork()函数在Linux中创建进程的实例讲解

    这篇文章主要介绍了使用C语言的fork()函数在Linux中创建进程的实例讲解,fork在父进程下创建出的子进程可以与父进程一起来多进程运行同一个程序,需要的朋友可以参考下
    2016-06-06
  • QT中对Mat类的一些操作详解

    QT中对Mat类的一些操作详解

    本文主要介绍了QT中对Mat类的一些操作详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 浅析C++中dynamic_cast和static_cast实例语法详解

    浅析C++中dynamic_cast和static_cast实例语法详解

    这篇文章主要介绍了浅析C++中dynamic_cast和static_cast实例演示,包括static_cast语法知识和static_cast的作用讲解,namic_cast 语法详解,需要的朋友可以参考下
    2021-07-07
  • 剖析C语言关键字之void,const,return

    剖析C语言关键字之void,const,return

    这篇文章主要为大家介绍了C语言关键字之void,const,return,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 详解C语言中的常量指针和指针常量

    详解C语言中的常量指针和指针常量

    这篇文章主要介绍了详解C语言中的常量指针和指针常量,包括其之间的区别是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • 简单谈谈C语言中的= 和==、!=

    简单谈谈C语言中的= 和==、!=

    这篇文章主要给大家介绍了关于C语言中= 和==、!=的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • C语言实现考勤管理系统

    C语言实现考勤管理系统

    这篇文章主要为大家详细介绍了C语言实现考勤管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • sqlserver,sqlite,access数据库链接字符串整理

    sqlserver,sqlite,access数据库链接字符串整理

    本节主要整理sqlserver,sqlite,access数据库链接字符串,有需要的朋友可以参考下
    2014-07-07
  • Visual Studio 2022 的安装和创建C++项目(图文教程)

    Visual Studio 2022 的安装和创建C++项目(图文教程)

    本文主要介绍了Visual Studio 2022 的安装和创建C++项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05

最新评论