訪問者模式學習筆記

訪問者模式

使用場景

一些對象結構相對固定。但經常需要對該對象進行訂製化操作。這個時候我們可以用到訪問模式。

  • 那些結構固定的對象稱為被受訪者,它接受訪問者的訪問,並將自己做為參數,傳遞給訪問者
  • 使用固定對象進行相關操作的類被稱為訪問者,它在上述調用後,獲得了受訪者對象的引用,因而可以對其進行操作

file

優缺點

  • 優點:將變化的訪問跟實際的對象結構切分開來
  • 缺點:訪問者和被訪問者互相依賴

一個demo

file

  • 一個電腦有滑鼠、鍵盤、顯示器組成,這些組件都是受訪者
  • 訪問者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",記錄程式碼人生,行業思考,科技評論