Visit 訪問者模式 Calcite 中應(yīng)用

訪問者模式

參考這個(gè)文章: http://www.itdecent.cn/p/6a16eae29ece

訪問者Visitor

visitor 訪問者 ,有visit 方法 。visit 方法可以接收不同參數(shù),利用java的動(dòng)態(tài)綁定,根據(jù)參數(shù)不同自動(dòng)選擇不同的方法調(diào)用。
或者visit 接受統(tǒng)一父類, 在方法里面具體到時(shí)候根據(jù)java 的instance of 去判斷visit的是誰(shuí)。
可以是一個(gè)接口和抽象類,被實(shí)現(xiàn)和繼承。 也就是我們可以有多種實(shí)現(xiàn)的visitor。

  1. visitor 接收到this。對(duì) this 利用了java 的動(dòng)態(tài)編譯,可以自動(dòng)識(shí)別重載的方法。 被訪問者需要accept visitor。
  2. 需要注意到 visitor到底是誰(shuí), 每個(gè)visitor 有自己的參數(shù),只要識(shí)別到visitor 是誰(shuí), visit 傳的參數(shù)是誰(shuí),即知道方法具體怎么調(diào)用,不需要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 內(nèi)部再調(diào)用visitor 的visit 方法,把自己傳入,讓visitor 根據(jù)識(shí)別再調(diào)用不同的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);
    }
}

主方法的調(diào)用

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容