访问者模式

来源:互联网 发布:vba利用窗体输入数据 编辑:程序博客网 时间:2024/05/01 21:51

访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

聚集是大多数的系统都要处理的一种容器对象,它保存了对其他对象的引用。对同类象的聚集可以用迭代子模式进行操作,如何针对一个保存有不同类型对象的聚集采取某种操作呢?这时使用访问者模式是一个值得考虑的问题。

访问者模式的实现方式是双重分派,状态模式的笔记里讲到Java是单分派语言,实现双重分派其实也就是两次使用单分派:数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作。

在实际系统中访问者模式通常是用来处理复杂的对象树结构的,而且访问者模式可以用来处理跨越多个等级结构的树树结构的问题。

访问者模式仅应当在被访问的类结构非常稳定的情况下使用,即很少出现要加入新节点的情况。如果出现要加入新节点的情况,那时就必须在每个访问对象里加入一个对应于这个新节点的访问操作,这将是对一个系统的大规模修改。

访问者模式提供了倾斜的可扩展性设计:方法集合的可扩展性和类集合的不可扩展性。总而言之,如果系统的数据结构是频繁变化的,则不适合使用访问者模式。

很多系统可以按照算法和数据结构分开,也就是说一些对象含有算法,而另一些对象含有数据。如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。

访问者模式的优点:

1.使得增加新的操作变得很容易。

2.将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。

3.可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

4.积累状态。每一个单独的访问者对象都集中了相关的行为,从而也就可以在访问的过程中将执行操作的状态积累在自己内部,而不是分散到很多的节点对象中。

访问者模式的缺点:

1.增加新节点类变得很困难。

2.破坏封装。访问者模式要求访问者对象访问并调用每一个节点对象的操作,这要求所有节点对象必须暴露一些自己的操作和内部状态。

原创粉丝点击