10、C++设计模式——装饰器模式(菜鸟教程例子)
原例网址:装饰器模式(菜鸟教程)
装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。
1 #include "iostream" 2 #include "string" 3 using namespace std; 4 5 6 7 //步骤1 创建一个接口 8 class Shape 9 { 10 public: 11 virtual void draw() = 0; 12 }; 13 14 15 16 //步骤2 创建实现接口的实体类 17 class Rectangle : public Shape 18 { 19 public: 20 void draw() 21 { 22 cout << "Shape: Rectangle" << endl; 23 }; 24 }; 25 26 class Circle : public Shape 27 { 28 public: 29 void draw() 30 { 31 cout << "Shape: Circle" << endl; 32 }; 33 }; 34 35 36 37 //步骤3 创建实现了 Shape 接口的抽象装饰类 38 class ShapeDecorator : public Shape 39 { 40 protected: 41 Shape* decoratedShape; 42 }; 43 44 45 46 //步骤4 创建扩展了 ShapeDecorator 类的实体装饰类 47 class RedShapeDecorator : public ShapeDecorator 48 { 49 public: 50 RedShapeDecorator(Shape* decoratedShape) //构造函数 51 { 52 this->decoratedShape = decoratedShape; 53 } 54 55 void draw() 56 { 57 this->decoratedShape->draw(); 58 this->setRedBorder(); 59 } 60 private: 61 void setRedBorder() 62 { 63 cout << "Border Color: Red" << endl; 64 } 65 }; 66 67 68 69 //步骤5 使用 RedShapeDecorator 来装饰 Shape 对象 70 void main() 71 { 72 Shape* circle = new Circle; 73 ShapeDecorator* redCircle = new RedShapeDecorator( new Circle ); 74 ShapeDecorator* redRectangle = new RedShapeDecorator( new Rectangle ); 75 76 cout << "Circle with normal border" <<endl; 77 circle->draw(); 78 79 cout << "\nCircle of red border" <<endl; 80 redCircle->draw(); 81 82 cout << "\nRectangle of red border" <<endl; 83 redRectangle->draw(); 84 85 86 delete circle; 87 delete redCircle; 88 delete redRectangle; 89 90 system("pause"); 91 }
运行结果: