Visit 访问者模式 Calcite 中应用

访问者模式

参考这个文章: 聊聊访问者模式与其在Calcite/Flink中的应用 - 简书

访问者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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值