您的位置:首页 > 移动开发 > Android开发

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实现的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: