动机
- 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。
如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响降为最低?
模式定义
动态(组合)地给一个对象增加一些额外地职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。
未使用该设计模式
```cpp //业务操作 class Stream{ public: virtual char Read(int number) = 0; virtual void Seek(int position) = 0; virtual void Write(char data) = 0;
virtual ~Stream() {} };
//主体类 class FileStream : public Stream { public: virtual char Read(int number) { //读文件流 } virtual void Seek(int position) { //定位文件流 } virtual void Write(char data) { //写文件流 } };
class NetworkStream : public Stream { public: virtual char Read(int number) { //读文件流 } virtual void Seek(int position) { //定位文件流 } virtual void Write(char data) { //写文件流 } };
class MemoryStream : public Stream { public: virtual char Read(int number) { //读文件流 } virtual void Seek(int position) { //定位文件流 } virtual void Write(char data) { //写文件流 } };
//扩展操作 class CrytoFileStream : public FileStream { public: virtual char Read(int number) { //额外的加密操作 FileStream::Read(number); //读文件流 //额外的加密操作 } virtual void Seek(int position) { //额外的加密操作 FileStream::Seek(position); //定位文件流 //额外的加密操作 } virtual void Write(char data) { //额外的加密操作 FileStream::Write(data); //写文件流 //额外的加密操作 } };
//扩展操作 class CrytoNetworkStream : public NetworkStream { public: virtual char Read(int number) { //额外的加密操作 //(59,80,101行代码相同,导致代码冗余) NetworkStream::Read(number); //读文件流 //额外的加密操作 } virtual void Seek(int position) { //额外的加密操作 NetworkStream::Seek(position); //定位文件流 //额外的加密操作 } virtual void Write(char data) { //额外的加密操作 NetworkStream::Write(data); //写文件流 //额外的加密操作 } };
//扩展操作 class CrytoMemoryStream : public MemoryStream { public: virtual char Read(int number) { //额外的加密操作 MemoryStream::Read(number); //读文件流 //额外的加密操作 } virtual void Seek(int position) { //额外的加密操作 MemoryStream::Seek(position); //定位文件流 //额外的加密操作 } virtual void Write(char data) { //额外的加密操作 MemoryStream::Write(data); //写文件流 //额外的加密操作 } };
class BufferedFileStream : public FileStream { //… }; class BufferedNetworkStream : public NetworkStream { //… }; class BufferedMemoryStream : public MemoryStream { //… };
class CrytoBufferedFileStream : public FileStream { public: virtual char Read(int number) { //额外的加密操作 //额外的缓存操作 FileStream::Read(number); //读文件流 //额外的加密操作 //额外的缓存操作 } virtual void Seek(int position) { //额外的加密操作 //额外的缓存操作 FileStream::Seek(position); //定位文件流 //额外的加密操作 //额外的缓存操作 } virtual void Write(char data) { //额外的加密操作 //额外的缓存操作 FileStream::Write(data); //写文件流 //额外的加密操作 //额外的缓存操作 } };
void Process() { // 编译时装配 CrytoFileStream* fs1 = new CrytoFileStream();
BufferedFileStream* fs2 = new BufferedFileStream();
CrytoBufferedFileStream *fs3 = new CrytoBufferedFileStream();
}
<a name="Q0rBY"></a>
#### 存在的问题

<a name="l2yyB"></a>
### 实现2
```cpp
//业务操作
class Stream{
public:
virtual char Read(int number) = 0;
virtual void Seek(int position) = 0;
virtual void Write(char data) = 0;
virtual ~Stream() {}
};
//主体类
class FileStream : public Stream
{
public:
virtual char Read(int number) {
//读文件流
}
virtual void Seek(int position) {
//定位文件流
}
virtual void Write(char data) {
//写文件流
}
};
class NetworkStream : public Stream
{
public:
virtual char Read(int number) {
//读文件流
}
virtual void Seek(int position) {
//定位文件流
}
virtual void Write(char data) {
//写文件流
}
};
class MemoryStream : public Stream
{
public:
virtual char Read(int number) {
//读文件流
}
virtual void Seek(int position) {
//定位文件流
}
virtual void Write(char data) {
//写文件流
}
};
//扩展操作
/*合并*/
//class CrytoFileStream
//{
// Stream* stream; //= new FileStream();
//public:
// virtual char Read(int number) {
// //额外的加密操作 //(59,80,101行代码相同,导致代码冗余)
// stream->Read(number); //读文件流
// //额外的加密操作
// }
// virtual void Seek(int position) {
// //额外的加密操作
// stream->Seek(position); //定位文件流
// //额外的加密操作
// }
// virtual void Write(char data) {
// //额外的加密操作
// stream->Write(data); //写文件流
// //额外的加密操作
// }
//};
//
////扩展操作
//class CrytoNetworkStream
//{
// Stream* stream; //= New NetworkStream();
//public:
// virtual char Read(int number) {
// //额外的加密操作
// stream->Read(number); //读文件流
// //额外的加密操作
// }
// virtual void Seek(int position) {
// //额外的加密操作
// stream->Seek(position); //定位文件流
// //额外的加密操作
// }
// virtual void Write(char data) {
// //额外的加密操作
// stream->Write(data); //写文件流
// //额外的加密操作
// }
//};
//
////扩展操作
//class CrytoMemoryStream
//{
// Stream* stream; //= new MemoryStream();
//public:
// virtual char Read(int number) {
// //额外的加密操作
// stream->Read(number); //读文件流
// //额外的加密操作
// }
// virtual void Seek(int position) {
// //额外的加密操作
// stream->Seek(position); //定位文件流
// //额外的加密操作
// }
// virtual void Write(char data) {
// //额外的加密操作
// stream->Write(data); //写文件流
// //额外的加密操作
// }
//};
class CryptoStream : public Stream
{
Stream* stream; //...
public:
CryptoStream(Stream* stm) :stream(stm)
{
}
virtual char Read(int number) {
//额外的加密操作
stream->Read(number); //读文件流
//额外的加密操作
}
virtual void Seek(int position) {
//额外的加密操作
stream->Seek(position); //定位文件流
//额外的加密操作
}
virtual void Write(char data) {
//额外的加密操作
stream->Write(data); //写文件流
//额外的加密操作
}
};
/*合并*/
//class BufferedFileStream : public FileStream {
// //...
//};
//class BufferedNetworkStream : public NetworkStream {
// //...
//};
//class BufferedMemoryStream : public MemoryStream {
// //...
//};
class BufferedStream : public Stream {
Stream* stream;
public:
BufferedStream(Stream* stm) :stream(stm)
{
}
virtual char Read(int number) {
//额外的传冲操作
stream->Read(number); //读文件流
//额外的传冲操作
}
virtual void Seek(int position) {
//额外的传冲操作
stream->Seek(position); //定位文件流
//额外的传冲操作
}
virtual void Write(char data) {
//额外的传冲操作
stream->Write(data); //写文件流
//额外的传冲操作
}
};
void Process() {
// 运行时装配
FileStream* s1 = new FileStream();
CryptoStream* s2 = new CryptoStream(s1);
BufferedStream* s3 = new BufferedStream(s1);
BufferedStream* s4 = new BufferedStream(s2);
}
实现3
//业务操作
class Stream{
public:
virtual char Read(int number) = 0;
virtual void Seek(int position) = 0;
virtual void Write(char data) = 0;
virtual ~Stream() {}
};
//主体类
class FileStream : public Stream
{
public:
virtual char Read(int number) {
//读文件流
}
virtual void Seek(int position) {
//定位文件流
}
virtual void Write(char data) {
//写文件流
}
};
class NetworkStream : public Stream
{
public:
virtual char Read(int number) {
//读文件流
}
virtual void Seek(int position) {
//定位文件流
}
virtual void Write(char data) {
//写文件流
}
};
class MemoryStream : public Stream
{
public:
virtual char Read(int number) {
//读文件流
}
virtual void Seek(int position) {
//定位文件流
}
virtual void Write(char data) {
//写文件流
}
};
class DecoratorStream : public Stream
{
protected:
Stream* stream; //...
DecoratorStream(Stream* stm) : stream(stm)
{
}
};
class CryptoStream : public DecoratorStream
{
public:
CryptoStream(Stream* stm) : DecoratorStream(stm)
{
}
virtual char Read(int number) {
//额外的加密操作
stream->Read(number); //读文件流
//额外的加密操作
}
virtual void Seek(int position) {
//额外的加密操作
stream->Seek(position); //定位文件流
//额外的加密操作
}
virtual void Write(char data) {
//额外的加密操作
stream->Write(data); //写文件流
//额外的加密操作
}
};
class BufferedStream : public DecoratorStream {
public:
BufferedStream(Stream* stm) : DecoratorStream(stm)
{
}
virtual char Read(int number) {
//额外的传冲操作
stream->Read(number); //读文件流
//额外的传冲操作
}
virtual void Seek(int position) {
//额外的传冲操作
stream->Seek(position); //定位文件流
//额外的传冲操作
}
virtual void Write(char data) {
//额外的传冲操作
stream->Write(data); //写文件流
//额外的传冲操作
}
};
void Process() {
// 运行时装配
FileStream* s1 = new FileStream();
CryptoStream* s2 = new CryptoStream(s1);
BufferedStream* s3 = new BufferedStream(s1);
BufferedStream* s4 = new BufferedStream(s2);
}