訪問者模式
參考這個(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。
- visitor 接收到this。對(duì) this 利用了java 的動(dòng)態(tài)編譯,可以自動(dòng)識(shí)別重載的方法。 被訪問者需要accept visitor。
- 需要注意到 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