定义:表示一个作用于某个对象结构中的各元素操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
使用场景:数据结构稳定,算法不稳定,使作用于结构上的操作解耦
实现:定义一个被访问的抽象类,声明一个接受访问者的方法。定义访问者抽象类,声明与被访问者相同个数且一一对应的方法,接着可以扩展访问者类,实现增加访问操作,最后定义一个枚举被访问者的类,提供一个高层接口以允许访问者访问它的元素。
优点:增加新的访问操作很简单。
缺点:数据结构绝对稳定的场景不多,如果新增数据结构就变得复杂了
代码示例:男人和女人当有不同状态来访问时,做出的反应。这里男人和女人是稳定的数据结构,因为只有这两种分类,别说什么人妖啊~~~
/** * 人类抽象类 * @author liuhao * */ public abstract class People { protected String tpye; public String getTpye() { return tpye; }
public void setTpye(String tpye) { this.tpye = tpye; }
public People(String tpye) { this.tpye = tpye; }
public abstract void accept(Visitor visitor); } /** * 访问者抽象类 * @author liuhao * */ public abstract class Visitor { protected String name; public Visitor(String name) { this.name = name; } public abstract void getManReply(Man man); public abstract void getWomanReply(Woman woman); }
public class Man extends People {
public Man(String tpye) { super(tpye); }
@Override public void accept(Visitor visitor) { visitor.getManReply(this); }
}
public class Woman extends People {
public Woman(String tpye) { super(tpye); }
@Override public void accept(Visitor visitor) { visitor.getWomanReply(this); }
}
public class SuccessVisitor extends Visitor {
public SuccessVisitor(String name) { super(name); }
@Override public void getManReply(Man man) { System.out.println("当"+man.getTpye()+this.name+"时,"+"背后大多有一个伟大的女人!"); }
@Override public void getWomanReply(Woman woman) { System.out.println("当"+woman.getTpye()+this.name+"时,"+"背后大多有一个失败的男人!"); }
}
public class FailVisitor extends Visitor {
public FailVisitor(String name) { super(name); }
@Override public void getManReply(Man man) { System.out.println("当"+man.getTpye()+this.name+"时,"+"闷头喝酒,谁也不用劝!"); }
@Override public void getWomanReply(Woman woman) { System.out.println("当"+woman.getTpye()+this.name+"时,"+"眼泪汪汪,谁也劝不了!"); }
}
public class AmativenessVisitor extends Visitor {
public AmativenessVisitor(String name) { super(name); }
@Override public void getManReply(Man man) { System.out.println("当"+man.getTpye()+this.name+"时,"+"凡事不懂也要装懂!"); }
@Override public void getWomanReply(Woman woman) { System.out.println("当"+woman.getTpye()+this.name+"时,"+"凡事懂也要装不懂!");
}
}
public class Main {
public static void main(String[] args) { ObjectStructure objectStructure = new ObjectStructure(); objectStructure.add(new Man("男人")); objectStructure.add(new Woman("女人")); Visitor success = new SuccessVisitor("成功"); objectStructure.visit(success); Visitor fail = new FailVisitor("失败"); objectStructure.visit(fail); Visitor amativeness = new AmativenessVisitor("恋爱"); objectStructure.visit(amativeness); }
} 结果:
