-
访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
-
访问者模式适用于数据结构相对稳定的系统。(如人类只有两个性别,可进行各状态对比)。
-
他把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
-
访问者模式的目的是要把处理从数据结构分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
-
访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为及中到一个访问这对象中。
-
访问者模式缺点,使增加新的数据结构变得困难了。
-
Visitor.java
public abstract class Visitor { public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA); public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB); }
-
ConcreteVisitor1.java 访问者1
public class ConcreteVisitor1 extends Visitor{ @Override public void VisitConcreteElementA(ConcreteElementA concreteElementA) { System.out.println(concreteElementA.getClass().getName() + "被" + this.getClass().getName() + "访问"); } @Override public void VisitConcreteElementB(ConcreteElementB concreteElementB) { System.out.println(concreteElementB.getClass().getName() + "被" + this.getClass().getName() + "访问"); } }
-
ConcreteVisitor2.java
public class ConcreteVisitor2 extends Visitor{ @Override public void VisitConcreteElementA(ConcreteElementA concreteElementA) { System.out.println(concreteElementA.getClass().getName() + "被" + this.getClass().getName() + "访问"); } @Override public void VisitConcreteElementB(ConcreteElementB concreteElementB) { System.out.println(concreteElementB.getClass().getName() + "被" + this.getClass().getName() + "访问"); } }
-
Element.java
public abstract class Element { public abstract void accept(Visitor visitor); }
-
ConcreteElementA.java
/** * 实例元素1(男) */ public class ConcreteElementA extends Element { @Override public void accept(Visitor visitor) { visitor.VisitConcreteElementA(this); } public void OperationA() { System.out.println("AAAAAAAAAAA"); } }
-
ConcreteElementB.java
/** * 实例元素2(女) */ public class ConcreteElementB extends Element { @Override public void accept(Visitor visitor) { visitor.VisitConcreteElementB(this); } public void OperationB() { System.out.println("BBBBBBBBBBB"); } }
-
ObjectStructure.java 能枚举他的元素,可以提供一个高层的接口以允许访问者访问他的元素
public class ObjectStructure { private List<Element> elements = new ArrayList<>(); public void attach(Element element) { elements.add(element); } public void detach(Element element) { elements.remove(element); } public void accept(Visitor visitor) { for (Element e : elements) { e.accept(visitor); } } }
-
Main.java
public class Main { public static void main(String[] args) { final ObjectStructure o = new ObjectStructure(); o.attach(new ConcreteElementA()); o.attach(new ConcreteElementB()); final ConcreteVisitor1 v1 = new ConcreteVisitor1(); final ConcreteVisitor2 v2 = new ConcreteVisitor2(); o.accept(v1); o.accept(v2); } }