Visitor
访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
访问者模式的优点就是增添新的操作比较容易,因为增加新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。
Visitor(Action):为该对象结构中ConcreteElement的每个具体类声明一个visit操作。
ConcreteVisitor(Fail、Success):具体访问者,实现Visitor声明操作。每个操作实现算法的一部分,而该算法片段乃是对应结构中对象的类。
Element:定义了一个accept操作,它以一个访问者作为参数。
ConcreteElement:具体元素,实现accept操作。
ObjectStruture:能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。
1 //访问者 2 public abstract class Action { 3 4 public abstract void getManConclusion(Man m); 5 6 public abstract void getWomanConclusion(Woman w); 7 8 }
1 //具体访问者,实现每个由Visitor声明的操作,每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。 2 class Success extends Action{ 3 4 @Override 5 public void getManConclusion(Man m) { 6 System.out.println(m.getClass().getName() + " " + this.getClass().getName() + " 时,背后多半有一个伟大的女人。"); 7 } 8 9 @Override 10 public void getWomanConclusion(Woman w) { 11 System.out.println(w.getClass().getName() + " " + this.getClass().getName() + " 时,背后多半有一个不成功的男人。"); 12 } 13 14 }
1 class Fail extends Action{ 2 3 @Override 4 public void getManConclusion(Man m) { 5 System.out.println(m.getClass().getName() + " " + this.getClass().getName() + " 时,闷头喝酒,谁都不用劝。"); 6 } 7 8 @Override 9 public void getWomanConclusion(Woman w) { 10 System.out.println(w.getClass().getName() + " " + this.getClass().getName() + " 时,眼泪汪汪,谁也劝不了。"); 11 } 12 13 }
1 //被访问者 2 public abstract class Person { 3 4 public abstract void accept(Action v); 5 6 }
1 class Man extends Person{ 2 3 @Override 4 public void accept(Action v) { 5 v.getManConclusion(this); //充分利用双分派技术,实现处理与数据结构分离。 6 } 7 8 public void operationA(){} 9 10 }
1 class Woman extends Person{ 2 3 @Override 4 public void accept(Action v) { 5 v.getWomanConclusion(this); 6 } 7 8 public void operationB(){} 9 }
1 //能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。 2 public class ObjectStructure { 3 4 private List<Person> elements = new ArrayList<Person>(); 5 6 public void attach(Person e){ 7 elements.add(e); 8 } 9 10 public void detach(Person e){ 11 elements.remove(e); 12 } 13 14 public void display(Action v){ 15 for(Person e : elements){ 16 e.accept(v); 17 } 18 } 19 20 }
1 public static void main(String[] args) { 2 ObjectStructure o = new ObjectStructure(); 3 4 o.attach(new Man()); 5 o.attach(new Woman()); 6 7 Success s = new Success(); 8 Fail f = new Fail(); 9 10 o.display(s); 11 o.display(f); 12 }
打印结果:
org.visitor.Man org.visitor.Success 时,背后多半有一个伟大的女人。
org.visitor.Woman org.visitor.Success 时,背后多半有一个不成功的男人。
org.visitor.Man org.visitor.Fail 时,闷头喝酒,谁都不用劝。
org.visitor.Woman org.visitor.Fail 时,眼泪汪汪,谁也劝不了。