作用:
1、表示一个作用于某对象结构中的各元素的操作,他使你可以在不改变元素的类的前提下定义作用于这些元素的新操作。
2、访问者模式适用于数据结构相对稳定的系统,他把数据结构和作用于结构上的操作之间的耦合解开,使得操作可以相对自由的演化。
3、访问者模式的目的就是把处理从数据结构中分离出来,如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是比较适合的。
4、访问者模式增加新的操作很容易,因为增加新的操作,就相当于增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。
5、访问者模式增加新的数据结构比较困难
1、访问者模式
1、抽象访问者(Visitor)角色
定义了对每一个元素 (Element) 访问的行为,它的参数就是可
以访问的元素,它的方法个数理论上来讲与元素类个数(Element的实现类个数)是一样的,从
这点不难看出,访问者模式要求元素类的个数不能改变
abstract class Visitor {
public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}
2、具体访问者(ConcreteVisitor)角色
给出对每一个元素类访问时所产生的具体行为。
class ConcreteVisitor1 extends Visitor {
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
}
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
}
}
class ConcreteVisitor2 extends Visitor {
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
}
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
}
}
3、抽象元素(Element)角色
定义了一个接受访问者的方法( accept ),其意义是指,每一个元素都要可以被访问者访问。
abstract class Element {
public abstract void accept(Visitor visitor);
}
4、具体元素(ConcreteElement)角色
提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。
class ConcreteElementA extends Element {
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
public void operationA(){
}
}
class ConcreteElementB extends Element {
public void accept(Visit