装饰模式主要意图是为对象扩展额外的职责,但对于用户来说,在使用行为上并没有任何的变化。在此举一个例子来解释该模式的含义。假如你手上有一张照片,此时可以给它盖上一片玻璃片,同时再套上一个精美的相框。如此相片就更好看同时又被更好地防护起来。此处的玻璃片以及相框,对于原来的照片来说,都是起到一个装饰的作用。并且,加上这些装饰后的照片,你能说它不是照片吗?不,它还是一个照片,是一个被精美装饰过后的照片。
在编程设计上,上面例子可描述如下:
1 class IImage 2 { 3 public: 4 // 图像总是要被绘制出来的 5 virtual void draw() {} 6 }; 7 class Photograph : public IImage 8 { 9 public: 10 // some code here........ 11 }; 12 class PhotograhDecorate : public IImage 13 { 14 public: 15 // some code here........ 16 17 protected: 18 inline IImage* getImage() { /* some code here........*/ } 19 20 private: 21 IImage* _image; 22 }; 23 class GlassDecorate : public PhotograhDecorate 24 { 25 public: 26 virtual void draw() override { 27 getImage()->draw(); 28 this->drawGlass(); 29 } 30 31 private: 32 void drawGlass() { 33 // some code here........ 34 } 35 36 }; 37 38 class FrameDecorate : public PhotograhDecorate 39 { 40 public: 41 virtual void draw() override { 42 getImage()->draw(); 43 this->drawFrame(); 44 } 45 46 private: 47 void drawFrame() { 48 // some code here........ 49 } 50 51 };