设计模式之装饰模式

意图:动态地(组合)给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活(消除重复代码,减少子类 数量)。

在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。

看下面的代码:

//代码在重复
class Stream
{
public:
	virtual char Read() = 0;
	virtual void Write() = 0;
	virtual ~Stream() {}
};
//主体类
class FileStream :public Stream
{
public:
	virtual char Read()
	{
		//...
	}
	virtual void Write()
	{
		//...
	}
};
//主体类
class NetworkStream :public Stream
{
public:
	virtual char Read()
	{
		//...
	}
	virtual void Write()
	{
		//...
	}
};

class CryptoFileStream :public FileStream
{
public:
	virtual char Read()
	{
		//额外的操作
		FileStream::Read();
	}
	virtual void Write()
	{
		//额外的操作
		FileStream::Write();
	}
};

class CryptoNetworkStream :public NetworkStream
{
public:
	virtual char Read()
	{
		//额外的操作
		NetworkStream::Read();
	}
	virtual void Write()
	{
		//额外的操作
		NetworkStream::Write();
	}
};
class CryptoButteredFileStream :public FileStream
{
public:
	virtual char Read()
	{
		//额外的加密操作
		//额外的缓冲操作
		FileStream::Read();
	}
	virtual void Write()
	{
		//额外的加密操作
		//额外的缓冲操作
		FileStream::Write();
	}
};

假如要扩展,那只能导致类越来越多,代码也会有很多重复。

修改如下:

//组合的方式
class Stream
{
public:
	virtual char Read() = 0;
	virtual void Write() = 0;
	virtual ~Stream() {}
};

class FileStream :public Stream
{
public:
	virtual char Read()
	{
		//...
	}
	virtual void Write()
	{
		//...
	}
};
class NetworkStream 
{
	Stream* stream;
public:
	virtual char Read()
	{
		//...
	}
	virtual void Write()
	{
		//...
	}
};
//既有基类成员,又继承基类
class CryptoStream:public DecoratorStream
{
//	Stream* stream;//=new FileStream();
public:
	CryptoStream(Stream* s) :DecoratorStream(s) {};
	virtual char Read()
	{
		//额外的操作
		stream->Read();
	}
	virtual void Write()
	{
		//额外的操作
		stream->Write();
	}
};

//装饰类
class DecoratorStream : public Stream
{
protected:
	Stream* stream;
public:
	DecoratorStream(Stream *s) :stream(s) {};
};
void Process()
{
	//通过装配来构造
	FileStream *fileStream = new FileStream();
	CryptoStream* cryptoFileStream = new CryptoStream(fileStream);
}

以组合的方式代替继承的方式的典型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值