JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > デザインパターン > Visitorパターン  
メニュー
Home
情報交換掲示板
Factory Method
Abstract Factory
Builder
Prototype
Singleton
Adapter
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Chain Of Responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy
Template Method
Visitor
  2003/07/25  田中宏和
Visitorパターン
◆概要
オブジェクトの構造上の要素で実行される処理を表現する。Visitorパターンを使用することにより処理を加えるクラスを変更することなしに新しい処理を定義できるようになる
◆UML
◆ここでの環境
OS Windows XP
J2SE SDK 1.4.1_01
◆概念的なソースコード
Visitor.java(ここからダウンロード)
abstract class Visitor {
  abstract public void visitConcreteElementA(ConcreteElementA
                                               concreteElementA);
  abstract public void visitConcreteElementB(ConcreteElementB
                                               concreteElementB);
}
ConcreteVisitor1.java(ここからダウンロード)
public class ConcreteVisitor1 extends Visitor{
  public void visitConcreteElementA(ConcreteElementA
                                     concreteElementA){

    System.out.println("ConcreteElementAがConcreteVisitor1によって訪問されました");
  }
  public void visitConcreteElementB(ConcreteElementB
                                     concreteElementB){

    System.out.println("ConcreteElementBがConcreteVisitor1によって訪問されました");
  }
}
ConcreteVisitor2.java(ここからダウンロード)
public class ConcreteVisitor2 extends Visitor{
  public void visitConcreteElementA(ConcreteElementA
                                     concreteElementA){

    System.out.println("ConcreteElementAがConcreteVisitor2によって訪問されました");
  }
  public void visitConcreteElementB(ConcreteElementB
                                     concreteElementB){

    System.out.println("ConcreteElementBがConcreteVisitor2によって訪問されました");
  }
}
Element.java(ここからダウンロード)
abstract class Element {
  abstract public void accept(Visitor visitor);
}
ConcreteElementA.java(ここからダウンロード)
public class ConcreteElementA extends Element{
  public void accept(Visitor visitor) {
    visitor.visitConcreteElementA(this);
  }
  public void operationA() {
  }
}
ConcreteElementB.java(ここからダウンロード)
public class ConcreteElementB extends Element{
  public void accept(Visitor visitor) {
    visitor.visitConcreteElementB(this);
  }
  public void operationA() {
  }
}
ObjectStructure.java(ここからダウンロード)
import java.util.*;

public class ObjectStructure {
  private ArrayList elements = new ArrayList();

  public void attach(Element element) {
    elements.add(element);
  }

  public void detatch(Element element) {
    elements.remove(element);
  }

  public void accept(Visitor visitor) {
    for (int i=0;i<elements.size();i++) {
      Element e = (Element)elements.get(i);
      e.accept(visitor);
    }
  }
}
Client.java(ここからダウンロード)
public class Client {
  public static void main(String[] args) {
    ObjectStructure o = new ObjectStructure();
    o.attach(new ConcreteElementA());
    o.attach(new ConcreteElementB());

    ConcreteVisitor1 v1 = new ConcreteVisitor1();
    ConcreteVisitor2 v2 = new ConcreteVisitor2();

    o.accept(v1);
    o.accept(v2);
  }
}
 
◆実行
コマンドプロンプト
C:\JavaHello\Visitor>javac *.java

C:\JavaHello\Visitor>java Client
ConcreteElementAがConcreteVisitor1によって訪問されました
ConcreteElementBがConcreteVisitor1によって訪問されました
ConcreteElementAがConcreteVisitor2によって訪問されました
ConcreteElementBがConcreteVisitor2によって訪問されました

C:\JavaHello\Visitor>

おおおお!実行できましたね!

 
 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME