设计模式之访问者模式
访问者模式:表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式的目的是要把处理从数据结构中分离出来。其实访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加新的访问者,访问者模式将有关的行为集中到一个访问者对象中。访问者模式的缺点就是使增加新的数据结构变得困难了。
举一个男人、女人在成功、失败、恋爱时,得出不同结论的例子:
public abstract class Action { public abstract void getManConclusion(Man concreteElementA); public abstract void getWomanConclusion(Woman concreteElementB); }
public class Success extends Action{ @Override public void getManConclusion(Man concreteElementA) { // TODO Auto-generated method stub String name = concreteElementA.getClass().getName(); System.out.println(name.substring(name.indexOf(".")+1) + "成功时,背后多半有一个伟大的女人"); } @Override public void getWomanConclusion(Woman concreteElementB) { // TODO Auto-generated method stub System.out.println(concreteElementB.getClass().getName() + "成功时背后大多有个不成功的男人"); } }
public class Failing extends Action{ @Override public void getManConclusion(Man concreteElementA) { // TODO Auto-generated method stub System.out.println("闷头喝酒"); } @Override public void getWomanConclusion(Woman concreteElementB) { // TODO Auto-generated method stub System.out.println("眼泪汪汪"); } }
public class Amativeness extends Action{ @Override public void getManConclusion(Man concreteElementA) { // TODO Auto-generated method stub System.out.println("凡事不懂也要装懂"); } @Override public void getWomanConclusion(Woman concreteElementB) { // TODO Auto-generated method stub System.out.println("凡事懂也装作不懂"); } }
public abstract class Person { public abstract void accept(Action visitor); }
public class Man extends Person{ @Override public void accept(Action visitor) { // TODO Auto-generated method stub visitor.getManConclusion(this); } }
public class Woman extends Person{ @Override public void accept(Action visitor) { // TODO Auto-generated method stub visitor.getWomanConclusion(this); } }
public class ObjectStructure { private List<Person> elements = new ArrayList<>(); public void attach(Person element){ elements.add(element); } public void detach(Person element){ elements.remove(element); } public void display(Action visitor){ for(Person e : elements){ e.accept(visitor); } } }
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub ObjectStructure o = new ObjectStructure(); o.attach(new Man()); o.attach(new Woman()); //成功时的反应 Success v1 = new Success(); o.display(v1); } }
代码结构:
对比访问者模式图,我们可以看到Element就是我们的"人"类,而ConcreteElementA和ConcreteElementB就是男人和女人,visitor就是我们写得“状态类”,具体的ConcreteVisitor就是那些“成功”,“失败”,“恋爱”等等状态,至于Objectstruct就是“对象结构”类了。