ビジターパターン(訪問者)、オブジェクト構造の各要素の動作において役割を示しています。それはあなたがこれらの新しい要素の動作に作用する各要素の前提の下で、クラスの定義を変更することはできませんになります。
例:
例えば口吹き男性の同僚、ポンプで女性の同僚を必要と風船を、吹くなど、一部の祝日、会社は、いくつかの屋外ゲームで各ゲームを一緒に行くためにスタッフを手配します、男性と女性の同僚の形でのタスクはまた異なっている、;乗馬サイクリングのための責任者、男性の同僚、背中などに座っ担当の女性の同僚と自転車。このシナリオでは、男性の同僚と女性の同僚は、2つの異なる要素であり、Visitorパターンを実装するために使用することができ、それぞれのゲームは訪問者です。
- 要素クラス
abstract class Person {
String name;
public Person(String name) {
this.name = name;
}
abstract void play(Game game);
}
// 男同事类
class ManWorkmate extends Person {
public ManWorkmate(String name) {
super(name);
}
@Override
void play(Game game) {
game.acceptManGame(this);
}
}
// 女同事类
class WomanWorkmate extends Person {
public WomanWorkmate(String name) {
super(name);
}
@Override
void play(Game game) {
game.acceptWomenManGame(this);
}
}
- 来場者は、そのゲームの様々な
abstract class Game {
abstract void acceptManGame(Person person);
abstract void acceptWomenManGame(Person person);
}
// 吹气球
class BallonGame extends Game {
@Override
void acceptManGame(Person person) {
System.out.println("男同事:" + person.name + " ,吹气球啦!");
}
@Override
void acceptWomenManGame(Person person) {
System.out.println("女同事:" + person.name + " ,用打气筒吹气球啦!");
}
}
// 骑自行车
class BikeGame extends Game {
@Override
void acceptManGame(Person person) {
System.out.println("男同事:" + person.name + " ,准备骑自行车啦!");
}
@Override
void acceptWomenManGame(Person person) {
System.out.println("女同事:" + person.name + " ,准备坐在自行车后座啦!");
}
}
- ゲームに関連する同僚を通過する別のゲームのためのオブジェクト構造は、異なる反応を得ます
class ObjectStructure {
List<Person> elements = new ArrayList<>();
void add(Person person) {
elements.add(person);
}
void del(Person person) {
elements.remove(person);
}
void beginGame(Game game){
for (Person person : elements) {
person.play(game);
}
}
}
- メインプログラム
class Test {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure();
Person xiaoLi = new ManWorkmate("小李");
Person xiaoWang = new WomanWorkmate("小王");
Person xiaoZhang = new ManWorkmate("小张");
Person xiaoZhao = new WomanWorkmate("小赵");
o.add(xiaoLi);
o.add(xiaoWang);
o.add(xiaoZhang);
o.add(xiaoZhao);
System.out.println("进行第一项游戏:吹气球");
Game game1 = new BallonGame();
o.beginGame(game1);
System.out.println("======");
System.out.println("进行第二项游戏:骑自行车");
Game game2 = new BikeGame();
o.beginGame(game2);
}
}
结果:
进行第一项游戏:吹气球
男同事:小李 ,吹气球啦!
女同事:小王 ,用打气筒吹气球啦!
男同事:小张 ,吹气球啦!
女同事:小赵 ,用打气筒吹气球啦!
======
进行第二项游戏:骑自行车
男同事:小李 ,准备骑自行车啦!
女同事:小王 ,准备坐在自行车后座啦!
男同事:小张 ,准备骑自行车啦!
女同事:小赵 ,准备坐在自行车后座啦!
あなたがゲームプレイを追加する必要がある場合は、単に追加する必要がありGame
、メインプログラムでは、サブカテゴリーをコールします
Game game3 = new OtherGame();
o.beginGame(game3);
これを達成することができます。
概要
動作は進化比較的自由に設定することができるように、データ構造に適用ビジターパターンは、構造体に作用する操作の間の結合を解放するために、比較的安定したシステム、およびデータ構造です。
目的は、Visitorパターンは、プロセスデータ構造から分離されているようにすることです。システムは、次に、アルゴリズムを変更するの訪問者の使用するために比較的安定しただけでなく、簡単なデータ構造を持っている場合、演算が容易になるビジターパターン増加させるようにするので、より適切です。
欠点は、新しいデータ構造の構造への訪問者の増加が困難になるです。GoFのの著者はかつて言った:「時間のほとんどは、あなたが訪問者モードを必要としませんが、できるだけ早くあなたが本当にそれを必要とするビジターパターンを必要として。」実際には、同じデータ構造を見出すことは困難です状況なので、Visitorパターンを使用する機会もあまりないです。