CSDN博客

img bosses

Visitor模式

发表于2004/10/27 22:03:00  809人阅读

分类: DesignPattern

这个模式的思路好像很简单。比如有一个基类,定义了3个方法,下面继承了3个子类。如果我们必须要给基类添加一个功能,然而这个功能或者不是这种对象的基本性质,而是为了实现一些附加功能,比如计数或者配置,或者这个功能对下面的3个子类有着不同的实现,那么这样的功能怎么加入类层次呢??

如果给基类增加一个方法,子类各自实现这个方法,那么如果以后还要增加功能,或者有新的子类产生,马么无疑这个实现将是爆炸式的。

Visitor解决了这个问题。只要向基类中加入Accept方法,允许Visitor类的访问,就可以应付以后预想不到的扩充。要做的就是3个子类来实现Accept方法为:Accept(Visitor v) { v.Visit(this); }。具体的功能由Visitor类来做。Visitor实现3个函数:Visit(DeriveA),Visit(DeriveB)和Visit(DeriveC),用于访问3个子类。

Visitor的方法和子类构成了一个矩阵,一个轴是不同的Visitor,一个轴是子类。这样的设计也不够好,一旦需要增加一个子类,那么所有的Visitor都要相应的增加一个Visit(DeriveX)的函数,全部要改变。
解决这个问题的方法称作AcyclicVisitor,它实现了一个稀疏矩阵,不同的Visitor不需要关注全部的子类,而只要关注它感兴趣的子类。

AcyclicVisitor的实现中,不同的VisitorX只Visit(DeriveInterested),对应的DeriveInterested的Accept方法有较大的改变,需要首先把传入的Visitor,cast为具体的VisitorX,然后才能调用VisitorX::Visit(this),因而影响了效率。
阅读全文
0 0

相关文章推荐

img
取 消
img