访问者模式
大多数情况下,你都不需要这么个模式。
适用场景,非常复杂:
1. 你需要对一个含有不同种类的对象的集合,进行遍历操作。
如果,这个操作时相同的,那就简单了,只需要让生成这些对象的类实现同一接口或者继承相同的类就可以了。
2. 针对不同种类的对象的操作不同。
不使用访问者模式,你可能需要一些判断。
3. 针对相同种类的对象的操作还可能会改变(即操作可能会扩展)。
访问者模式,对操作(也可以叫做访问)的扩展支持非常好。
在访问者模式当中,这个“操作”被称之为“访问”。
uml图如下:
解释:
1. Element是我们所需要遍历的元素的父类。有一个统一的父类,可以聚集到一起。另外有个accept函数,用于被“访问”,Vistor是参数。
2. ObjectStructure,聚集Element的类,Client通过它来对Element进行访问。
3. Vistor是真正的访问者。“访问”的操作在子类中实现。有几种元素,它就会定义几种相应的抽象方法。
4. Element中accept函数,是实现对不同种类对象执行不同“访问”的关键,在具体的子类中,它会调用参数vistor中与自己对应的那个方法。这就实现了针对不同对象,执行不同的操作的目的。
5. 扩展不同的操作十分容易,只要重新定义一个Vistor类。
优点:
适用场景,就是优点。
缺点:
1. 复杂
2. 如果想要对Element扩展,就得改变Visit接口(或抽象类),子类也要做出改变,十分困难。