一、用途和目的
作用于某个对象群中各个对象的操作,它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作,故使用访问者的前提是对象很少改变,而操作会经常增加和修改
如何扩展一个现有的类层次结构来实现新行为?一般的方法是给类添加新的方法。但是万一新行为和现有对象模型不兼容怎么办?还有,类层次结构设计人员可能无法预知以后开发过程中将会需要哪些功能。以及,如果已有的类层次结构不允许修改代码,怎么能扩展行为呢?
二、主要思想
在支持单分派语言(如c++,java等)中模拟双分派; 将数据(element)和行为(visitor)分开
三、类图关系
四、优点
易于添加那些目前尚未考虑到的方法。(这也是使用访问者的原因:扩展功能)
可以使类更加小巧,因为那些很少使用的方法,可以在外部定义。(意味着如果一个方法经常使用,最好定义在类中;当然在第一次定义中没有考虑到此方法除外)
五、缺点
破坏封装性 ---- 要求visitor可以从外部修改element的状态:1)提供public接口;2)把visitor声明为友元
新增一个ConcreteElement会比较麻烦,每增加一个新的element,所有涉及的visitor都要增加接口