装饰模式

动机:由于多重的继承带来的重复很多代码,为了解决这种子类衍生问题

class Stream{
	public void seek(){
		...
	}
}

class FileStream extends Stream{
	@Override
	public void seek(){
		...
	}
}

class NetworkStream extends Stream{
	@Override
	public void seek(){
		...
	}
}

class BufferFileStream extends FileStream{

	Stream s;//fileStream
	@Override
	public void seek(){
		//xxx操作
		s.seek();
		//xxx操作
	}
}

class BufferNetworkStream extends NetworkStream{

	Stream s;//cryptStream
	@Override
	public void seek(){
		//xxx操作
		s.seek();
		//xxx操作
	}
}

由于继承了不同的类,但是类中其实本质上都是由接口Stream不同子类实现的方法执行的,并且执行的方法前后操作都相同,这时候应该合并方法,但是问题又来了,根据GOF原则讲到,子类共同的部分应该往上派生,也就是在父类,或者接口实现(装饰器),于是由此得出以下代码

class Stream{
	public void seek(){
		...
	}
}

class FileStream extends Stream{
	@Override
	public void seek(){
		...
	}
}

class NetworkStream extends Stream{
	@Override
	public void seek(){
		...
	}
}

class DecorateStream{
	Stream s;//...各种流

	public DecorateStream(Stream stream){
		this.s=stream;
	}
}

class BufferStream extends DecorateStream{

	//Stream s;//...各种流
	@Override
	public void seek(){
		//xxx操作
		s.seek();
		//xxx操作
	}
}

最后附上两个区别的类关系图
未使用装饰模式的类关系图
使用了装饰者模式之后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值