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

访问者模式(Visitor Pattern)

2015-01-27 21:42 246 查看

定义

什么是访问者呢?就拿身边的一个例子来看看吧。你有一栋房子,房子里面有很多管道、电路之类的东西,很显然,这些东西你不懂,是别人帮你弄好的。有一天,你家的管道出问题了,于是你需要解决这个问题,但是你不懂,所以你需要找专业人员(管道修理工)来维护,这个你找的人对于你的房子来说他就是访问者了。访问者设计模式主要包含两个角色:访问者和被访问的对象。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中,使得增加新的操作变得很容易。如果你熟悉MVC模型,那么可以发现,在MVC中,M是被访问者,C是访问者。访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。



被访问的对象可以是任何对象,但是,通常而言,该对象是部分-整体结构(比如组合设计模式中的组合对象)的一个节点。对于访问者而言,他知道复杂结构中的每个节点的细节,知道如何去访问和操作每个节点的属性以及方法。其类图静态关系如下所示:



在上述所示的关系图中,Visitor协议定义了两个看起来很相似的visit*方法,用于访问和处理不同的Element类型的对象。具体的访问者ConcreteVisitor(1或2)实现了Visitor协议及其定义的方法,这些方法为特定类型的Element类型的对象定义了一些适当的操作。而客户端手动创建访问者对象ConcreteVisitor,然后把该对象传给目标Element对象结构(该Element实现了accepts通用访问者类型的方法),此处的客户端是知道该Element对象结构需要使用哪个访问者的。一般而言,Element类中所实现的accept方法很相似,互相通用。通过访问者,客户端可以不需要直接和被访问者接触,他只需要请访问者去和被访问者接触即可完成自己所需要的事情。

代码示例

(待续)

总结

当某个对象存在一些和对象依赖性低或者重复率较高的代码时,可以使用访问者模式把这些代码移到访问者中去,此外,当需要支持不同变化或者某些操作变化比较频繁的时候,可以把不同版本的代码移植到不同的访问者对象中去。

使用访问者的设计模式有以下优点:

扩展性好。可以把和数据相关的操作分布到访问者中去,不同的访问者可以定义扩展不同的操作方法
符合单一性原则。
缺点也是有的:

当需要增加一种类型的Element的时候,抽象访问者需要增加对应的抽象方法,所有已经实现的访问者也都需要实现该方法,挺麻烦的。不过你要是让你的访问者不支持对该对象的访问,那就不存在该问题了。

由于访问者模式可以扩展被访问者对象的操作类型(或者说方法),这个和IOS中的 Categories的功能很是相似,这是不是说可以使用Categories替代需要使用的访问者呢?的却可以仅仅使用Categories而不需要使用访问者的,但是访问者能够给客户端提供更加统一一致的操作方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息