装饰模式主要意图是为对象扩展额外的职责,但对于用户来说,在使用行为上并没有任何的变化。在此举一个例子来解释该模式的含义。假如你手上有一张照片,此时可以给它盖上一片玻璃片,同时再套上一个精美的相框。如此相片就更好看同时又被更好地防护起来。此处的玻璃片以及相框,对于原来的照片来说,都是起到一个装饰的作用。并且,加上这些装饰后的照片,你能说它不是照片吗?不,它还是一个照片,是一个被精美装饰过后的照片。

    在编程设计上,上面例子可描述如下:

 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 };
相片装饰编码参考

相关文章:

  • 2021-10-28
猜你喜欢
  • 2022-12-23
  • 2021-10-30
  • 2021-05-19
  • 2022-12-23
  • 2021-05-16
  • 2021-05-30
相关资源
相似解决方案