设计模式--装饰模式C++实现

装饰模式C++实现

1定义

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活、可作为继承的替代

2类图

3实现

//构件

class Component

{

protected:

  Component();

public:

   virtual void operate() = 0;

  virtual ~Component() = 0;

};

class ConcreteComponent: public Component

{

public:

  ConcreteComponent();

  ~ConcreteComponent();

  void operate()

  {

    cout << " do Something..."<<endl;

  }

};

//注,这里的继承很关键,因为客户端只是知道Component,而不知Decorator,这样做提供了多态表示的机会

class Decorator:public Component

{

private:

  Component *_com;

public:

  Decorator(Component* com)

    :_com(com)

  {} 

  void operate()

  {

     _com->operate();

  }

};

class ConcreteDecorator:public Decorator

{

public:

  ConcreteDecorator(Component *com) 

    :Decorator(com)

  {}

private:

  void method1()

  {

    cout << "装饰1"<<endl;

  }

  void operate()

  {

    method1();

    Decorator::operate();

  }

};

void Test

{

  component *com = new ConcreteComponent();

  com = new ConcreteDecorator(com);

  com.operate();

};

4应用

①优点

装饰类和被装饰类可以独立发展,不会有耦合关系。Decorator是从外部扩展功能,而不知道具体的构建

装饰模式是继承关系的一个替代方案。实现的是is-a关系(注解继承)

可以动态的扩展一个类的功能

②缺点

多层装饰会有无限剥离的问题,影响效率,性能,工作量大

5使用场景

需要扩展一个类的功能,附加功能

需要动态给一个对象增加功能,且可以再动态撤销

需要为一批兄弟类进行改装或加装功能,首选装饰功能

6辨析

继承时静态增加功能

装饰是动态增加功能

原文地址:https://www.cnblogs.com/lang5230/p/5328304.html