定义:
访问者模式(Visitor),表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
访问者模式适用于数据结构相对稳定的结构,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以自由的演化。
访问者模式的目的是,要把处理从数据结构上分离出来。有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是比较的适合的,因为访问者模式使算法的操作增加变得容易。
访问者模式的 缺点使把增加新得数据结构变得困难。
自己理解思路图:
实现代码如下:
1 public abstract class Visitor { 2 public abstract void visitConcreteElementA(ConcreteElementA conA); 3 public abstract void visitConcreteElementB(ConcreteElementB conB); 4 }
1 public class ConcreteVisitor1 extends Visitor { 2 3 @Override 4 public void visitConcreteElementA(ConcreteElementA conA) { 5 System.out.println(this.getClass().getName()+"----"+conA.getClass().getName()); 6 7 } 8 9 @Override 10 public void visitConcreteElementB(ConcreteElementB conB) { 11 System.out.println(this.getClass().getName()+"----"+conB.getClass().getName()); 12 } 13 14 }
1 public class ConcreteVisitor2 extends Visitor { 2 3 @Override 4 public void visitConcreteElementA(ConcreteElementA conA) { 5 System.out.println(this.getClass().getName()+"----"+conA.getClass().getName()); 6 7 } 8 9 @Override 10 public void visitConcreteElementB(ConcreteElementB conB) { 11 System.out.println(this.getClass().getName()+"----"+conB.getClass().getName()); 12 13 } 14 15 }
1 public abstract class Element { 2 public abstract void accept(Visitor visitor); 3 }
1 public class ConcreteElementA extends Element{ 2 3 @Override 4 public void accept(Visitor visitor) { 5 visitor.visitConcreteElementA(this); 6 } 7 public void operateA(){ 8 9 } 10 11 }
1 public class ConcreteElementB extends Element{ 2 3 @Override 4 public void accept(Visitor visitor) { 5 visitor.visitConcreteElementB(this); 6 } 7 8 public void operateB(){ 9 10 } 11 12 }
1 public class TestVisitor { 2 public static void main(String[] args) { 3 ObjectStructure ob = new ObjectStructure(); 4 ob.attach(new ConcreteElementA()); 5 ob.attach(new ConcreteElementB()); 6 7 Visitor v1 = new ConcreteVisitor1(); 8 Visitor v2 = new ConcreteVisitor2(); 9 10 ob.accept(v1); 11 ob.accept(v2); 12 13 } 14 }
com.cai.designMethods.visitor.ConcreteVisitor1----com.cai.designMethods.visitor.ConcreteElementA com.cai.designMethods.visitor.ConcreteVisitor1----com.cai.designMethods.visitor.ConcreteElementB com.cai.designMethods.visitor.ConcreteVisitor2----com.cai.designMethods.visitor.ConcreteElementA com.cai.designMethods.visitor.ConcreteVisitor2----com.cai.designMethods.visitor.ConcreteElementB