ビジターモード


Visitor パターンでは、要素クラスの実行アルゴリズムを変更する Visitor クラスを使用します。このようにして、要素の実行アルゴリズムは、訪問者の変化に応じて変化する可能性があります。このタイプの設計パターンは動作パターンです。スキーマによれば、要素オブジェクトはビジター オブジェクトを受け入れているため、ビジター オブジェクトは要素オブジェクトに対する操作を処理できます。

はじめに

目的: 主にデータ構造とデータ操作を分離します。

主に以下を解決します: 安定したデータ構造と揮発性の操作の結合の問題。

いつ使用するか: オブジェクト構造内のオブジェクトに対してさまざまな無関係な操作を実行する必要があり、これらの操作がこれらのオブジェクトのクラスを「汚染」しないようにする必要があります。これらをカプセル化するには、ビジター パターンを使用します。クラス。 。

解決方法: 訪問クラスで訪問者を受け入れるための外部インターフェースを追加します。

キーコード: データベースクラスには、訪問者を受け入れ、独自の参照を訪問者に渡すメソッドがあります。

応用例: あなたは友人の家に来客しており、訪問者であり、友人はあなたの訪問を受け入れ、あなたは友人の説明を渡し、友人の説明を判断します。これが訪問者モードです。

利点: 1. 単一責任の原則を遵守します。 2. 優れた拡張性。 3. 柔軟性。

短所: 1. 特定の要素が訪問者に詳細を開示するため、ディミット原則に違反します。 2. 特定の要素を変更するのは困難です。 3. 依存関係逆転の原則に違反し、抽象化ではなく具象クラスに依存します。

使用シナリオ: 1. オブジェクト構造内のオブジェクトに対応するクラスはほとんど変更されませんが、多くの場合、このオブジェクト構造に対して新しい操作を定義する必要があります。 2. オブジェクト構造内のオブジェクトに対して、関連性のないさまざまな操作を多数実行する必要があります。これらの操作によってオブジェクトのクラスが「汚染」されることを避ける必要があり、新しい操作を追加するときにこれらのクラスを変更したくありません。

注: 訪問者は機能を統合し、レポート、UI、インターセプター、フィルターを作成できます。

実装

操作の受け入れを定義するComputerPartインターフェイスを作成します。 KeyboardMouseMonitor、および Computer は、ComputerPart インターフェイスを実装するエンティティ クラスです。訪問者クラスの操作を定義する別のインターフェイス ComputerPartVisitor を定義します。 コンピューター エンティティ訪問者を使用して、対応するアクションを実行します。

VisitorPatternDemo のデモ クラスは、ComputerComputerPartVisitor クラスを使用して、訪問者パターンの使用法を示します。

visitor_pattern_uml_diagram.jpg

ステップ 1

要素を表すインターフェースを定義します。

ComputerPart.java

public interface class ComputerPart {
   public void accept(ComputerPartVisitor computerPartVisitor);
}

ステップ 2

上記のクラスを拡張するエンティティ クラスを作成します。

Keyboard.java

public class Keyboard  implements ComputerPart {

   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}

Monitor.java

public class Monitor  implements ComputerPart {

   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}

Mouse.java

public class Mouse  implements ComputerPart {

   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}

Computer.java

public class Computer implements ComputerPart {
	
   ComputerPart[] parts;

   public Computer(){
      parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};		
   } 


   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      for (int i = 0; i < parts.length; i++) {
         parts[i].accept(computerPartVisitor);
      }
      computerPartVisitor.visit(this);
   }
}

ステップ 3

訪問者を表すインターフェイスを定義します。

ComputerPartVisitor.java

public interface ComputerPartVisitor {
	public void visit(Computer computer);
	public void visit(Mouse mouse);
	public void visit(Keyboard keyboard);
	public void visit(Monitor monitor);
}

ステップ 4

上記のクラスを実装するエンティティ ビジターを作成します。

ComputerPartDisplayVisitor.java

public class ComputerPartDisplayVisitor implements ComputerPartVisitor {

   @Override
   public void visit(Computer computer) {
      System.out.println("Displaying Computer.");
   }

   @Override
   public void visit(Mouse mouse) {
      System.out.println("Displaying Mouse.");
   }

   @Override
   public void visit(Keyboard keyboard) {
      System.out.println("Displaying Keyboard.");
   }

   @Override
   public void visit(Monitor monitor) {
      System.out.println("Displaying Monitor.");
   }
}

ステップ 5

ComputerPartDisplayVisitorを使用して、Computerのコンポーネントを表示します。

VisitorPatternDemo.java

public class VisitorPatternDemo {
   public static void main(String[] args) {

      ComputerPart computer = new Computer();
      computer.accept(new ComputerPartDisplayVisitor());
   }
}

ステップ 6

出力を確認します。

りー