访问者模式
参考这个文章: https://www.jianshu.com/p/6a16eae29ece
访问者Visitor
visitor 访问者 ,有visit 方法 。visit 方法可以接收不同参数,利用java的动态绑定,根据参数不同自动选择不同的方法调用。
或者visit 接受统一父类, 在方法里面具体到时候根据java 的instance of 去判断visit的是谁。
可以是一个接口和抽象类,被实现和继承。 也就是我们可以有多种实现的visitor。
- visitor 接收到this。对 this 利用了java 的动态编译,可以自动识别重载的方法。 被访问者需要accept visitor。
- 需要注意到 visitor到底是谁, 每个visitor 有自己的参数,只要识别到visitor 是谁, visit 传的参数是谁,即知道方法具体怎么调用,不需要debug。
class Visitor {
public void visit(Beijing dou){
}
public void visit(Shanghai dou){
}
public void visit(Hangzhou dou){
}
public void visit(AllCity city){
}
}
class RichManVisitor extends Visitor {
public void visit(Beijing city){
System.out.println(" you qian visit " + city.getClass().getName());
}
public void visit(Shanghai city){
System.out.println(" you qian visit " + city.getClass().getName());
}
public void visit(Hangzhou city){
System.out.println(" you qian visit " + city.getClass().getName());
}
public void visit(AllCity city){
System.out.println(" you qian visit " + city.getClass().getName());
}
}
被访问者
被访问者,有accept 方法,可以接受visitor 的visit。 被访问者, accept 接收visitor, 在accept 内部再调用visitor 的visit 方法,把自己传入,让visitor 根据识别再调用不同的visitor方法。
interface City {
void accept(Visitor v);
}
class AllCity implements City {
List<City> cities = Arrays.asList(new Beijing(),new Shanghai(),new Hangzhou());
public void accept(Visitor v){
for (City city : cities){
city.accept(v); // 用田叔
}
v.visit(this);
}
}
class Beijing implements City {
public void accept(Visitor v){
v.visit(this);
}
}
class Shanghai implements City {
public void accept(Visitor v){
v.visit(this);
}
}
class Hangzhou implements City {
public void accept(Visitor v){
v.visit(this);
}
}
主方法的调用
public class TestVisitor {
public static void main(String[] args) {
AllCity allCity = new AllCity();
Visitor visitor = new RichManVisitor();
allCity.accept(visitor);
}
}
最终的输出
you qian visit Beijing
you qian visit Shanghai
you qian visit Hangzhou
you qian visit AllCity