您的位置:首页 > 其它

21-IO流-19-IO流(字符流-缓冲区-装饰设计模式和继承的区别)

2015-08-11 10:52 411 查看
装饰设计模式和继承都能进行对象功能的扩展增强,有什么区别?

首先有一个继承体系。

Writer

|--TextWriter:用于操作文本

|--MediaWriter:用于操作媒体

想要对操作的动作进行效率的提高。

【方案一】

按照面向对象,可以通过继承进行功能扩展。

效率提高需要加入缓冲技术。那么上述继承体系扩展为:

Writer

|--TextWriter

|--BufferTextWriter:加入了缓冲技术的操作文本对象

|--MediaWriter

|--BufferMediaWriter:加入了缓冲技术的操作媒体对象

到这里基本搞定。但是这样做不太理想。因为如果又多个流对象(比如操作flash),如果该流也要提高效率,是不是仍然要产生子类?

是的,这时发现如果提高功能一味地靠继承完成,那么继承体系就会越来越复杂,不够灵活。

【方案二】

重新思考问题:既然加入的都是同一种技术——缓冲。

方案一是让缓冲和具体的对象相结合,即发生关系。是否可以将缓冲进行单独的封装,哪个对象需要缓冲就将哪个对象和缓冲关联。

class Buffer{

Buffer(TextWriter w){

}

Buffer(MediaWriter w){

}

}

若再来一个新的流对象,那么需要往上述代码中继续增加,麻烦!发现这些流对象都是Writer的子类,那么根据多态思想,直接缓冲

父类Writer即可,则其所有子类均被缓冲到。

class Buffer{

Buffer(Writer w){

}

}

发现Buffer是“高效写”,TextWriter是“文本写”,MediaWriter是“媒体写”,那么都是“写”,所以代码优化成以下形式:

class BufferWriter extends Writer{

BufferWriter(Writer w){

}

}

所以最初继承体系升级为:

Writer

|--TextWriter

|--MediaWriter

|--BufferWriter:加入缓冲技术,用于提高效率。

【由此可见】方案二比方案一更灵活,即装饰设计模式比继承更加灵活。

以后只要需要对象功能增强,优先考虑装饰设计模式。

(【注意】装饰类和被装饰类必须所属于同一个接口或者父类)(你是乞丐,我是乞丐buf,我们都是乞丐)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: