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,我们都是乞丐)
首先有一个继承体系。
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,我们都是乞丐)
相关文章推荐
- 简单实现微信录音+转码(.MP3)
- 解决T400\T500\W500等安装win10驱动后黑屏问题
- 设计模式之适配器模式
- 更新和删除文档
- 最齐全的Android studio 快捷键(亲测可用)
- 黑马程序员-集合框架(二)
- 链队列
- 安装Win10正式版后foobar2000打不开的两种解决办法
- codeforce 315 div2
- UTF-8
- iOS中.m中,@interface部分的作用
- 错误笔记150811--引用问题
- hdu 1358 Period(kmp)
- hdoj 1863 畅通工程
- request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别
- 算法竞赛入门经典: 第三章 数组和字符串 3.4竖式问题
- 21-IO流-17-IO流(字符流-缓冲区-自定义MyBufferedReader-readLine方法)
- APP搜索附近功能的一种解决方案-基于百度LBS云服务
- ZigBee路由协议分析(机制,算法,发现,建立)
- winform之自定义控件