Java Visitor Pattern(ビジターモード)

2967 ワード

ビジターモード(Visitor Pattern)では、要素クラスの実行アルゴリズムを変更するビジタークラスを使用します.このようにして、要素の実行アルゴリズムは、アクセス者が変化するにつれて変化することができる.このタイプの設計モードは動作モードに属する.モードによっては、エレメントオブジェクトがアクセス者オブジェクトを受け入れ、エレメントオブジェクト上の操作を処理できます.
キーコード:データ・ベース・クラスには、アクセス者を受け入れ、自身をアクセス者に参照する方法があります.
長所:1、単一職責の原則に合致する.2、優れた拡張性.3、柔軟性.欠点:1、具体的な要素は訪問者に詳細を公表し、ディミットの原則に違反している.2、具体的な要素の変更は難しい.3、依存逆転の原則に違反し、具体的な類に依存し、抽象に依存していない.
注意:アクセス者は、レポート、UI、ブロッキング、フィルタなどの機能を統合できます.
  • は、要素を表すインタフェースを定義する.
  • /**
     * 1.            。
     * @author mazaiting
     */
    public interface ComputerPart {
        public void accept(ComputerPartVisitor visitor);
    }
    
  • 上記のクラスを拡張したエンティティクラスを作成します.
  • /**
     * 2.             。
     * @author mazaiting
     */
    public class Computer implements ComputerPart{
    
        public void accept(ComputerPartVisitor visitor) {
            visitor.visit(this);        
        }
    }
    
    /**
     * 2.             。
     * @author mazaiting
     */
    public class Keyboard implements ComputerPart{
    
        public void accept(ComputerPartVisitor visitor) {
            visitor.visit(this);        
        }
    
    }
    
    /**
     * 2.             。
     * @author mazaiting
     */
    public class Monitor implements ComputerPart{
    
        public void accept(ComputerPartVisitor visitor) {
            visitor.visit(this);        
        }
    
    }
    
    /**
     * 2.             。
     * @author mazaiting
     */
    public class Mouse implements ComputerPart{
    
        public void accept(ComputerPartVisitor visitor) {
            visitor.visit(this);        
        }
    
    }
    
  • は、アクセス者を表すインタフェースを定義する.
  • /**
     * 3.             。
     * @author mazaiting
     */
    public interface ComputerPartVisitor {
        /*public void visit(Computer computer);
        public void visit(Mouse mouse);
        public void visit(Keyboard keyboard);
        public void visit(Monitor monitor);*/
        public  void visit(T t);
    }
    
  • は、上記のクラスを実装したエンティティ・アクセス者を作成する.
  • /**
     * 4.               。
     * @author mazaiting
     */
    public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
    
        public  void visit(T t) {
            System.out.println(t.getClass().getName());
        }
    
        /*public void visit(Computer computer) {
            System.out.println("Displaying Computer.");
        }
    
        public void visit(Mouse mouse) {
            System.out.println("Displaying Mouse.");
        }
    
        public void visit(Keyboard keyboard) {
            System.out.println("Displaying Keyboard.");
        }
    
        public void visit(Monitor monitor) {
            System.out.println("Displaying Monitor.");
        }*/
    
    }
    
  • ComputerPartDisplayVisitorを使用してComputerのコンポーネントを表示します.
  • /**
     * 5.    ComputerPartDisplayVisitor     
     * Computer      。
     * @author mazaiting
     */
    public class Client {
        public static void main(String[] args) {
            ComputerPart computer = new Computer();
            computer.accept(new ComputerPartDisplayVisitor());
        }
    }
    
  • 印刷結果
  • com.mazaiting.visitor.Computer