设计模式之装饰器模式

  1 // Decorator.cpp : 定义控制台应用程序的入口点。
  2 //
  3 /*
  4 请问装饰器模式的好处体现在哪里 ?
  5 我在网上查找有关装饰器模式的资料时,发现所有的材料都说装饰器模式“可以动态地给对象添加额外的职责, 就象在墙上刷油漆。”我有些不解:所谓的“动态”是什么意思,用继承难道就不“动态”了?
  6 还有,在谈到装饰器模式与继承相比的优点时,人们总是说它:
  7 1、可以在不改变原有对象的情况下为对象添加更多动能
  8 2、可以保证了和被装饰对象的接口不变
  9 3、灵活地扩充新功能
 10 4、多个装饰器可以根据不同的需要,组合使用
 11 我还是不解,继承不也是“可以在不改变原有对象的情况下为对象添加更多动能”吗?
 12 还有,“可以保证了和被装饰对象的接口不变”是什么意思?
 13 装饰器的“灵活”性又体现在哪里?
 14 总之,我就是不太明白装饰器模式与继承相比优势到底在哪里?
 15 
 16 
 17 已有专家认为继承不是最好的复用模式,因为有很多父类中的方法,属性并不是子类所需要的,而是在继承中被强制拥有的。
 18 所以为了避免这种情况,提倡把特定的功能封装到装饰器中,在自由组合使用,从而避免继承的先天问题。
 19 */
 20 
 21 #include "stdafx.h"
 22 #include <iostream>
 23 //1+n+n*(!m/2)
 24 
 25 class  stream {
 26 public:
 27     virtual void read() = 0;
 28     virtual void write() = 0;
 29     virtual void seek() = 0;
 30 };
 31 
 32 class fileStream : public stream {
 33 public:
 34     virtual void read() {
 35         std::cout << "file read" << std::endl;
 36     }
 37     virtual void write() {
 38         std::cout << "file write" << std::endl;
 39     }
 40     virtual void seek() {
 41         std::cout << "file seek" << std::endl;
 42     }
 43 };
 44 
 45 class networkStream : public stream {
 46 public:
 47     virtual void read() {
 48         std::cout << "network read" << std::endl;
 49     }
 50     virtual void write() {
 51         std::cout << "network write" << std::endl;
 52     }
 53     virtual void seek() {
 54         std::cout << "network seek" << std::endl;
 55     }
 56 };
 57 
 58 class memoryStream : public stream {
 59 public:
 60     virtual void read() {
 61         std::cout << "memory read" << std::endl;
 62     }
 63     virtual void write() {
 64         std::cout << "memory write" << std::endl;
 65     }
 66     virtual void seek() {
 67         std::cout << "memory seek" << std::endl;
 68     }
 69 };
 70 
 71 class decoratorStram : public stream{
 72 protected:
 73     stream * m_pStream;
 74 };
 75 
 76 class bufferStram : public decoratorStram {
 77 public:
 78     bufferStram(stream* s) { m_pStream = s; }
 79 public:
 80     virtual void read() override {
 81         std::cout << "buffer: " << std::endl;
 82         m_pStream->read();
 83     }
 84     virtual void write() override {
 85         std::cout << "buffer: " << std::endl;
 86         m_pStream->write();
 87     }
 88     virtual void seek() override {
 89         std::cout << "buffer: " << std::endl;
 90         m_pStream->seek();
 91     }
 92 };
 93 
 94 class cryptoStram : public decoratorStram {
 95 public:
 96     cryptoStram(stream* s) { m_pStream = s; }
 97 public:
 98     virtual void read() override {
 99         std::cout << "crypt: " << std::endl;
100         m_pStream->read();
101     }
102     virtual void write() override {
103         std::cout << "crypt: " << std::endl;
104         m_pStream->write();
105     }
106     virtual void seek() override {
107         std::cout << "crypt: " << std::endl;
108         m_pStream->seek();
109     }
110 };
111 
112 int main()
113 {
114     stream* pBaseStream = new memoryStream();
115     stream* pStream = new cryptoStram(pBaseStream);
116     pStream->write();
117     stream* pStream2 = new bufferStram(pBaseStream);
118     pStream2->seek();
119     system("pause");
120     return 0;
121 }

 

posted @ 2021-06-22 22:14  njit-sam  阅读(54)  评论(0)    收藏  举报