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 }