美文网首页
Visit 访问者模式 Calcite 中应用

Visit 访问者模式 Calcite 中应用

作者: grasslike | 来源:发表于2021-12-30 10:49 被阅读0次

访问者模式

参考这个文章: https://www.jianshu.com/p/6a16eae29ece

访问者Visitor

visitor 访问者 ,有visit 方法 。visit 方法可以接收不同参数,利用java的动态绑定,根据参数不同自动选择不同的方法调用。
或者visit 接受统一父类, 在方法里面具体到时候根据java 的instance of 去判断visit的是谁。
可以是一个接口和抽象类,被实现和继承。 也就是我们可以有多种实现的visitor。

  1. visitor 接收到this。对 this 利用了java 的动态编译,可以自动识别重载的方法。 被访问者需要accept visitor。
  2. 需要注意到 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

相关文章

网友评论

      本文标题:Visit 访问者模式 Calcite 中应用

      本文链接:https://www.haomeiwen.com/subject/dqovqrtx.html