Android系统设计中的设计模式分析之三

本文通过生动的比喻和实例代码,详细介绍了设计模式中的访客模式。对比迭代器模式,阐述了访客模式如何在不修改现有代码的基础上动态地增加新的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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.youkuaiyun.com/hguisu/article/details/7564039
大意是父类负责逻辑组合部分,实现共同的逻辑部分,并把不同子类具有的不同逻辑部分通过protected abstract方法开放出去,由子类负责具体的实现。
在Android中,View的源码中,draw()方法承担了逻辑组合的功能,负责所有绘制逻辑的实现。同时View也实现了共同的逻辑部分,如绘制padding,操作matrix等。而不同的子类的不同具体绘制形为是通过实现抽象方法onDraw实现的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值