JavaのグラフィカルなデザインパターンVisitorパターン

オンデマンドテストシステム

1)歌手の評価のために、男性と女性に人々を分け、歌手のショーを見た後、彼らは歌手について異なる意見を(など、成功、失敗、などさまざまな種類ありますが、評価)を取得
2)従来方式
ここに画像を挿入説明

分析の伝統的な方法を質問

1)システムが比較的小さい場合には、問題はありませんが、より多くの新機能を追加し、システムを検討する際に、コードの変更は、比較的大きいクラスOCPの原則に違反して、メンテナンスを助長されていません。
そのような人クラス、または管理の新しいタイプを追加するなど2)貧困層のスケーラビリティ、。

Visitorパターンの基本的な導入

1)モードの訪問者(ビジターパターン)、データ構造の特定の要素の動作に影響の一部をカプセル化し、それはこれらの要素の動作に新たなデータ構造を前提としての役割の定義を変更することはできません。
2)メインデータ構造およびデータの分離操作、及び作動の問題解決するために結合されたデータ構造
3)基本的な動作原理は、ビジターパターンである:プラス訪問クラスでアクセスされた外部インターフェイスを提供
4)ビジターパターンをメインシナリオ:オブジェクトの多くの異なる操作のターゲット構造の必要性(これらの操作が互いに関連付けられていない)、これらのオブジェクトのこれらの操作クラス「汚染」を作る必要性を回避しながら、あなたが解決ビジターパターンを使用することができます。
ここに画像を挿入説明
説明:
1)は、抽象ビジタービジター、クラス宣言ConcreteElementのそれぞれを操作するための訪問のオブジェクト構造です。
2)ConcreteVisitor:アクセス特定の値、各動作が各部の動作が達成され、旅行者のステートメントを達成しました。
3)ObjectStructure要素への訪問者のアクセスを可能にするために高レベルのインターフェイスを提供することができ、その要素を列挙することができます。
4)要素を定義にビジター・オブジェクトを受信するための方法を受け入れます。
5)ConcreteElementコンクリート要素は、メソッドの実装クラスを受け入れます。

訪問者モードの応用例

ここに画像を挿入説明

package com.example.demo.visitor;

import javax.activation.MailcapCommandMap;

public abstract class Action {
	
	/**
	 * 得到男性的测评
	 * @param man
	 */
	public abstract void getManResult(Man man);
	
	/**
	 * 得到女的测评
	 * @param woman
	 */
	public abstract void getWomanResult(Woman woman);

}
package com.example.demo.visitor;

public class Fail extends Action{

	@Override
	public void getManResult(Man man) {
		// TODO Auto-generated method stub
		System.out.println(" 男人给的评价该歌手很失败 ! ");
	}

	@Override
	public void getWomanResult(Woman woman) {
		// TODO Auto-generated method stub
		System.out.println(" 女人给的评价该歌手很失败 ! ");
	}

}
package com.example.demo.visitor;

public class Success extends Action{

	@Override
	public void getManResult(Man man) {
		// TODO Auto-generated method stub
		System.out.println(" 男人给的评价该歌手很成功 ! ");
	}

	@Override
	public void getWomanResult(Woman woman) {
		// TODO Auto-generated method stub
		System.out.println(" 女人给的评价该歌手很成功 ! ");
	}

}
package com.example.demo.visitor;

public abstract class Person {
	
	public abstract void accept(Action action);
}
package com.example.demo.visitor;

public class Man extends Person {

	@Override
	public void accept(Action action) {
		// TODO Auto-generated method stub
		action.getManResult(this);
	}

}
package com.example.demo.visitor;

/**
 * 说明
 * 1. 这里我们使用到了双分派,即首先在客户端程序中,将具体状态作为参数传递Woman中(第一次分派)
 * 2. 然后Woman 类调用作为参数的 “具体方法” 中方法getWomanResult,同时将自己(this)作为参数传入,完成第二次的分派
 * @author zhaozhaohai
 *
 */
public class Woman extends Person {

	@Override
	public void accept(Action action) {
		// TODO Auto-generated method stub
		action.getWomanResult(this);
	}

}
package com.example.demo.visitor;

import java.util.LinkedList;
import java.util.List;

/**
 * 数据结构,管理很多人(Man,Woman)
 * @author zhaozhaohai
 *
 */
public class ObjectStructure {

	/**
	 * 维护一个集合
	 */
	private List<Person> persons = new LinkedList<Person>();
	
	/**
	 * 增加到list
	 * @param person
	 */
	public void attach(Person person) {
		persons.add(person);
	}
	
	/**
	 * 移除
	 * @param person
	 */
	public void detach(Person person) {
		persons.remove(person);
	}
	
	/**
	 * 显示测试情况
	 * @param action
	 */
	public void display(Action action) {
		for (Person person : persons) {
			person.accept(action);
		}
	}
}
package com.example.demo.visitor;

public class Wait extends Action{

	@Override
	public void getManResult(Man man) {
		// TODO Auto-generated method stub
		System.out.println(" 男人给的评价是该歌手待定。。 ");
	}

	@Override
	public void getWomanResult(Woman woman) {
		// TODO Auto-generated method stub
		System.out.println(" 女人给的评价是该歌手待定。。 ");
	}

}
package com.example.demo.visitor;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 创建ObjectStructure
		ObjectStructure objectStructure = new ObjectStructure();
		objectStructure.attach(new Man());
		objectStructure.attach(new Woman());
		
		// 成功
		Success success = new Success();
		objectStructure.display(success);
		System.out.println("-------------------");
		// 失败
		Fail fail = new Fail();
		objectStructure.display(fail);
		System.out.println("----------给的是待定的测评------------");
		Wait wait = new Wait();
		objectStructure.display(wait);
	}

}

概要-ダブルディスパッチ
、上述したダブルディスパッチ、ディスパッチは、いわゆる二重の変化に我々が実行する方法を見つけることを期待することができますどのような種類に関係なく、を指します。2つの動作を得るためのデュアル型クラスと割り当て手段は、受信者の要求に依存して行います。
あなたは、単に、アクションサブクラスがクライアントに呼び出すことができる他のクラスのコードを変更する必要を追加していない、二重派遣以来、クラスと反応ウーマンマンクラスの影響を待機状態のクラスを追加するとします。
![ここの挿入の説明](https://img-blog.csdnimg.cn/20200328211428620.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW8xMjk5MDAyNzg4,size_16,color_FFFFFF,t_

NotesとVisitorパターンの詳細

利点:
1)責任の原則に沿って、単一Visitorパターンなので、プログラムは、優れた拡張性と柔軟性を持っていることは非常に高いです。
2)Visitorパターンは、機能を統一することができ、レポートを作ることができ、データ構造のためのUI、インターセプタとフィルタは、比較的安定したシステムです。
短所:
1)訪問者の公表内容の具体的な要素、デメテルの法則によって推奨されていないクラスの内部的な詳細の他のタイプ、このタイプの原因の特定の要素に焦点を当てるために、その訪問者がより困難に変わります。
2)原則として、原因クラスに反し、依存訪問者の特定の要素に依存して、というよりも抽象的要素。
3)したがって、システムは、比較的安定したデータ構造を有する場合、絶えず機能要件が変更され、その後、ビジターパターンがより適切です。

おすすめ

転載: www.cnblogs.com/haizai/p/12593368.html