模式定义:
动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,装饰模式比生成子类(继承)更为灵活(消除重复代码 & 减少子类个数)
使用动机:
在某些情况下我们可能会“过度的使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。
class Stream
{
public:
virtual char Read(int num) = 0;
virtual void Seek(int pos) = 0;
virtual void Write(char data) = 0;
virtual ~Stream() { }
};
class FileStream : public Stream
{
public:
virtual char Read(int num) { return ' '; }
virtual void Seek(int pos) { }
virtual void Write(char data) { }
};
class NetworkStream : public Stream
{
public:
virtual char Read(int num) { return ' '; }
virtual void Seek(int pos) { }
virtual void Write(char data) { }
};
// 装饰模式(扩展某类操作方法)
class CryptoStream : public Stream // 注意:这里继承Stream是为了继承接口实现
{
private:
Stream *m_pStream;
public:
CryptoStream(Stream *pStream) : m_pStream(pStream) { }
virtual char Read(int num)
{
// 解密处理...
return m_pStream->Read(num);
}
virtual void Seek(int pos)
{
m_pStream->Seek(pos);
}
virtual void Write(char data)
{
// 加密处理...
m_pStream->Write(data);
}
};
int main(array<System::String ^> ^args)
{
FileStream fileStream;
CryptoStream cryptoStream(&fileStream); // 运行时候装配(晚绑定)
NetworkStream networkStream;
CryptoStream cryptoStream2(&networkStream); // 运行时候装配(晚绑定)
return 0;
}