訪問者模式學習筆記
訪問者模式
使用場景
一些對象結構相對固定。但經常需要對該對象進行訂製化操作。這個時候我們可以用到訪問模式。
- 那些結構固定的對象稱為被受訪者,它接受訪問者的訪問,並將自己做為參數,傳遞給訪問者
- 使用固定對象進行相關操作的類被稱為訪問者,它在上述調用後,獲得了受訪者對象的引用,因而可以對其進行操作
優缺點
- 優點:將變化的訪問跟實際的對象結構切分開來
- 缺點:訪問者和被訪問者互相依賴
一個demo
- 一個電腦有滑鼠、鍵盤、顯示器組成,這些組件都是受訪者
- 訪問者ComputerPartDisplayVisitor可以訪問這些部分
受訪者的統一抽象介面
public interface ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor);
}
一個具體的受訪者實現:電腦的鍵盤部分
public class Keyboard implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
一個具體的受訪者實現:電腦的顯示器部分
public class Monitor implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
定義訪問者的能訪問哪些電腦部件介面:
public interface ComputerPartVisitor {
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
基於上述介面定義具體的訪問行為:
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}
@Override
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}
}
將具體某個電腦部件,交給訪問者訪問
public class VisitorPatternDemo {
public static void main(String[] args) {
//將鍵盤部分交給訪問者訪問
ComputerPart computer = new Keyboard();
computer.accept(new ComputerPartDisplayVisitor());
}
}
另外一個demo
在JSqlParser中源碼中,一個SQL由多部分組成,比如where條件部分、排序部分。這些部分的個性化訪問,也使用了訪問者模式
參考資料
//www.runoob.com/design-pattern/visitor-pattern.html
歡迎關注我的個人公眾號"西北偏北UP",記錄程式碼人生,行業思考,科技評論

