Visit 访问者模式 Calcite 中应用

访问者模式

参考这个文章: 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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容