我与C++设计模式(十九)——访客模式

来源:互联网 发布:oracle 输入数据 编辑:程序博客网 时间:2024/06/09 20:19

根据visitor pattern的设计初衷是,为了解决在客户加需求后不大范围破坏原有系统构造而设计的,将更新(变更)封装到一个类中,并由待更改类提供一个接口。

UML图:


其实不不太懂这句话,看图也没有很好的理解,但是,我看到了这篇文章,太棒了,文章中举得例子也很棒,对于visitor他只是一个接口visit(),不过他的各个子类能够用这个visit函数访问任意一个element的成员,当然这个前提是element给我们提供了一个缺口,专业一点,应该叫接口,accept,accept有一个形参:visitor指针,调用这个visitor指针的visit函数,这是一个“双重分派过程”,记住这个词,以为真正在运行时调用哪个visit函数,第一要看element指针指向那个子类对象,第二要看传入的形参指针accept指向的是哪个visitor子类,他们共同决定了调用哪个visit函数。不同的visitor子类中实现了不同visit函数,visit函数有一个element指针类型的形参,如例中income子类能够用更改收入,vacation子类能够更改休假。再来理解该文章中这一段话就容易了:

访问者模式适用于数据结构相对未定的系统(收入可能要变,假期也可能要变),它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作。这样的过程叫做"双重分派"。节点调用访问者,将它自己传入,访问者则将某算法针对此节点执行。

双重分派意味着施加于节点之上的操作是基于访问者和节点本身的数据类型,而不仅仅是其中的一者。

我已经不打算传入自己的代码了,这篇文章的代码足够了。。。
0 0
原创粉丝点击