【起源】
类的层次结构稳定,但同一rank上的类的行为不稳定(随时需要扩展),将需要扩展的方法隔离封装出来,就是Visitor模式。
【动机】
表示一个作用于某个对象结构中的各元素的操作。它可以在不改变各元素类的前提下,定义作用于这些元素的新操作。
【核心】
抽象类/接口 类1 类2 类3 。。。
方法1
方法2
方法3
。。。
AbstractVisitor v1 v2 v3 。。。
通常是使用 抽象类/接口 在水平方向上扩展子类,以应对变化;
Visitor是在垂直方向上扩展,应对方法种类的变化;
具体调用的方法 由(类,visitor)共同决定,具体类(主人)留出一个Accept接口 与 具体的Visitor(访问者)握手。
Visitor需要对每个具体类(主人)有所了解,并实现 visit 方法。
Strategy 与 Visitor 在微观上有相似之处:都是把实现操作的代码,封装到外部;
它们也有明显的不同之处:Strategy封装出来的操作可以应用到每个兄弟类中,即多个兄弟类有操作方面的共性,而Visitor要面对很有个性的多个兄弟。
一个具体的visitor帮助所有兄弟类增加一个方法,需要增加n个方法,就实现n个具体的visitor。
【代码实例】
【模型图】