进步始于交流
收获源于分享

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

介绍

  • Component抽象构件
    Component是一个接口或者是抽象类, 就是定义我们最核心的对象, 也就是最原始的对象, 如上面的成绩单。
  • ConcreteComponent 具体构件
    ConcreteComponent是最核心、 最原始、 最基本的接口或抽象类的实现, 你要装饰的就是它。
  • Decorator装饰角色
    在它的属性里必然有一个
    private变量指向Component抽象构件。若只有一个装饰类,则可以没有抽象装饰角色,直接实现具体的装饰角色即可
  • ConcreteDecorator具体装饰角色
    要把最核心的、 最原始的、 最基本的东西装饰成其他东西。

原始方法和装饰方法的执行顺序在具体的装饰类是固定的, 可以通过方法重载实现多种执行顺序。

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

缺点: 多层的装饰是比较复杂的, 尽量减少装饰类的数量, 以便降低系统的复杂度

应用:

  • 需要扩展一个类的功能, 或给一个类增加附加功能。
  • 需要动态地给一个对象增加功能, 这些功能可以再动态地撤销。
  • 需要为一批的兄弟类进行改装或加装功能, 当然是首选装饰模式。

范例

抽象构件

#ifndef COMPONENT_H
#define COMPONENT_H
class Component {
//抽象的构件
public:
    virtual void operate() = 0;
};
#endif // COMPONENT_H

具体构件

#ifndef CONCRETECOMPONENT_H
#define CONCRETECOMPONENT_H
#include "component.h"
#include <QDebug>
class ConcreteComponent : public Component {
public:
    void operate() override {
        qDebug()<<"ConcreteComponent do Something";
    }
};
#endif // CONCRETECOMPONENT_H

抽象装饰角色

#ifndef DECORATOR_H
#define DECORATOR_H
#include "component.h"
class Decorator : public Component {
//通过构造函数传递被修饰者
public:
    Decorator(Component *component){
        component_ = component;
    }
    //委托给被修饰者执行
    void operate() override {
        component_->operate();
    }
private:
    Component *component_ = nullptr;
};
#endif // DECORATOR_H

具体装饰角色

#ifndef CONCRETEDECORATOR_H
#define CONCRETEDECORATOR_H
#include <QDebug>
#include "decorator.h"
class ConcreteDecorator1 : public Decorator {
public:
    ConcreteDecorator1(Component *component)
        : Decorator(component) {
    }
    //重写父类的Operation方法
    void operate() override {
        method1();
        Decorator::operate();
    }
private:
    //定义自己的修饰方法
    void method1(){
        qDebug()<<"method1 of Decorator1";
    }
};
class ConcreteDecorator2 : public Decorator {
public:
    ConcreteDecorator2(Component *component)
        : Decorator(component) {

    }
    //重写父类的Operation方法
    void operate() override {
        method1();
        Decorator::operate();
    }
private:
    //定义自己的修饰方法
    void method1(){
        qDebug()<<"method1 of Decorator2";
    }
};
#endif // CONCRETEDECORATOR_H

main

#include "concretecomponent.h"
#include "concretedecorator.h"
int main(int argc, char *argv[]) {
    Component *component = new ConcreteComponent();
    //第一次修饰
    component = new ConcreteDecorator1(component);
    //第二次修饰
    component = new ConcreteDecorator2(component);
    //修饰后运行
    component->operate();
}

例子又忘了delete。。。每个例子到最后main都忘了delete

结果

method1 of Decorator2
method1 of Decorator1
ConcreteComponent do Something

源码GitHub:CppDesignPattern
相关链接:C++设计模式

赞(0) 打赏
未经允许不得转载:Coologic » C++设计模式-装饰模式

评论 108

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #108
  2. #107
  3. #106
  4. #105
  5. #104
  6. #103

    1

    php://input1个月前 (08-28)回复
  7. #102

    1

    "1个月前 (08-28)回复
  8. #101

    1

    '1个月前 (08-28)回复
  9. #100
  10. #99
  11. #98
  12. #97
  13. #96
  14. #95
  15. #94
  16. #93
  17. #92
  18. #91
  19. #90
  20. #89
  21. #88
  22. #87
  23. #86
  24. #85
  25. #84

    1

    1()"1个月前 (08-28)回复
  26. #83
  27. #82

    1

    php://input.2个月前 (08-06)回复
  28. #81

    1

    print 28763*4196403;2个月前 (08-06)回复
  29. #80
  30. #79
  31. #78

    1

    ;print 28763*4196403;2个月前 (08-06)回复
  32. #77
  33. #76
  34. #75
  35. #74
  36. #73
  37. #72
  38. #71
  39. #70
  40. #69
  41. #68
  42. #67
  43. #66
  44. #65
  45. #64
  46. #63
  47. #62
  48. #61
  49. #60
  50. #59
  51. #58
  52. #57
  53. #56
  54. #55
  55. #54
  56. #53
  57. #52
  58. #51
  59. #50
  60. #49
  61. #48
  62. #47
  63. #46
  64. #45
  65. #44
  66. #43
  67. #42
  68. #41
  69. #40
  70. #39
  71. #38
  72. #37
  73. #36
  74. #35
  75. #34
  76. #33
  77. #32
  78. #31
  79. #30
  80. #29
  81. #28
  82. #27
  83. #26
  84. #25
  85. #24
  86. #23

    1

    /bin/cat /etc/passwd2个月前 (08-06)回复
  87. #22

    1

    1"'`--2个月前 (08-06)回复
  88. #21

    1

    1]]]]]]]]]2个月前 (08-06)回复
  89. #20

    1

    1'"2个月前 (08-06)回复
  90. #19
  91. #18
  92. #17
  93. #16
  94. #15
  95. #14
  96. #13
  97. #12
  98. #11
  99. #10
  100. #9
  101. #8
  102. #7
  103. #6
  104. #5
  105. #4
  106. #3
  107. #2

    1

    1()"&%1'-;'2个月前 (08-06)回复
  108. #1

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏