Android系统设计中的设计模式分析之三
2012-10-17 16:37
344 查看
了解老码农个人隐私,请看这里:http://www.koulianbing.com/?page_id=12
Visitor
先贴一个有代码例子,且好理解的文章:
http://www.cnblogs.com/shanghaif/archive/2008/12/08/1350417.html
再转发一个我认为最形象的解释。
如果有一棵继承树,你要使用某个独立的对象遍历这棵树,并且呼叫树上某一个共同的方法,那么你使用iterator。比如这是一棵苹果树,你使用一个摘苹果的杆子把苹果一个一个摘下来,这就是iterator。
现在你有好几棵树,苹果树、葡萄树、酸枣树等,对每一种果实,你都有不同的杆子,摘取果实。这个时候就可以使用visitor模式。
当然,Java对象都源自Ojbect类,所以原则上所有的对象都来自同一棵树,以Object为根。这时候不妨假设一棵树有不同的子树,或者同一棵树上有不同的果实。
不使用visitor模式行不行,行。那你就使用Iterator模式,像这样:
while(it.hasNext()){
Object o = it.next();
if (苹果 instanceof o){...}
else if(葡萄 instanceof o){...}
。。。
}
这样好像也没什么问题,只是一旦有操作进来,比如要给不同的树打不同的农药,就要改写这个条件转移。
用了Visitor模式之后呢,奇迹发生了,你拿出所有的杆子举到每一个果实那里,苹果会自己找到摘苹果的杆子,让杆子把自己摘下来,葡萄会找到摘葡萄的杆子,把自己摘下来。
如果有打农药、授粉等等任务进来,Visitor模式可以允许动态加入一个新的visitor类代表打农药、授粉等,做到这一点不需要修改代码。这就是OCP。你把所有的农药都放到每一个果实跟前,果实就自行找到正确的农药自己打上。把所有的花粉放到果实跟前,果实就自己找到正确的花粉授粉。
你只有这些种水果杆子/农药/花粉,如果你有新的水果种类,对不起,只好改写代码。Visitor模式不支持这种情况下的OCP。
Template Method
参见:http://blog.csdn.net/hguisu/article/details/7564039
大意是父类负责逻辑组合部分,实现共同的逻辑部分,并把不同子类具有的不同逻辑部分通过protected abstract方法开放出去,由子类负责具体的实现。
在Android中,View的源码中,draw()方法承担了逻辑组合的功能,负责所有绘制逻辑的实现。同时View也实现了共同的逻辑部分,如绘制padding,操作matrix等。而不同的子类的不同具体绘制形为是通过实现抽象方法onDraw实现的。
Visitor
先贴一个有代码例子,且好理解的文章:
http://www.cnblogs.com/shanghaif/archive/2008/12/08/1350417.html
再转发一个我认为最形象的解释。
如果有一棵继承树,你要使用某个独立的对象遍历这棵树,并且呼叫树上某一个共同的方法,那么你使用iterator。比如这是一棵苹果树,你使用一个摘苹果的杆子把苹果一个一个摘下来,这就是iterator。
现在你有好几棵树,苹果树、葡萄树、酸枣树等,对每一种果实,你都有不同的杆子,摘取果实。这个时候就可以使用visitor模式。
当然,Java对象都源自Ojbect类,所以原则上所有的对象都来自同一棵树,以Object为根。这时候不妨假设一棵树有不同的子树,或者同一棵树上有不同的果实。
不使用visitor模式行不行,行。那你就使用Iterator模式,像这样:
while(it.hasNext()){
Object o = it.next();
if (苹果 instanceof o){...}
else if(葡萄 instanceof o){...}
。。。
}
这样好像也没什么问题,只是一旦有操作进来,比如要给不同的树打不同的农药,就要改写这个条件转移。
用了Visitor模式之后呢,奇迹发生了,你拿出所有的杆子举到每一个果实那里,苹果会自己找到摘苹果的杆子,让杆子把自己摘下来,葡萄会找到摘葡萄的杆子,把自己摘下来。
如果有打农药、授粉等等任务进来,Visitor模式可以允许动态加入一个新的visitor类代表打农药、授粉等,做到这一点不需要修改代码。这就是OCP。你把所有的农药都放到每一个果实跟前,果实就自行找到正确的农药自己打上。把所有的花粉放到果实跟前,果实就自己找到正确的花粉授粉。
你只有这些种水果杆子/农药/花粉,如果你有新的水果种类,对不起,只好改写代码。Visitor模式不支持这种情况下的OCP。
Template Method
参见:http://blog.csdn.net/hguisu/article/details/7564039
大意是父类负责逻辑组合部分,实现共同的逻辑部分,并把不同子类具有的不同逻辑部分通过protected abstract方法开放出去,由子类负责具体的实现。
在Android中,View的源码中,draw()方法承担了逻辑组合的功能,负责所有绘制逻辑的实现。同时View也实现了共同的逻辑部分,如绘制padding,操作matrix等。而不同的子类的不同具体绘制形为是通过实现抽象方法onDraw实现的。
相关文章推荐
- Android系统设计中存在设计模式分析
- Android系统设计中存在设计模式分析
- Android系统设计中的设计模式分析之一
- Android系统设计中的设计模式分析之一
- Android系统设计中存在设计模式分析
- Android系统设计中存在设计模式分析
- Android系统设计中的设计模式分析之四
- Android系统设计中的设计模式分析之二
- Android系统设计中存在设计模式分析
- Android系统设计中存在设计模式分析
- Android系统设计中存在设计模式分析
- 【转】Android系统设计中的设计模式分析(汇总)
- 求 架构设计 的视屏和 设计模式的视频 性能优化 的视频 系统源码分析 的视频 android
- Android源码设计模式分析开源项目
- Android系统Recovery工作原理之使用update.zip升级过程分析(四)---Android系统Recovery模式的工作原理
- Android 最常用的设计模式二 安卓源码分析——组合模式(component)
- Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析
- Tomcat 系统架构与设计模式,第 2 部分 设计模式分析
- Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析
- Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析