动机:由于多重的继承带来的重复很多代码,为了解决这种子类衍生问题
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操作
}
}
最后附上两个区别的类关系图