Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_0Number_5Number_4Number_1Number_4Number_2Number_4
インデント OCPとデザインパターン
インデント サンプルコードについて
インデント デザインパターン ひとくちメモ
インデント FactoryMethodパターン
インデント AbstractFactoryパターン
インデント Builderパターン
インデント Prototypeパターン
インデント Adapterパターン
インデント Bridgeパターン
インデント Compositeパターン
インデント Decoratorパターン
インデント Facadeパターン
インデント Flyweightパターン
インデント Proxyパターン
インデント TemplateMethodパターン
インデント Chain of Responsibilityパターン
インデント Commandパターン
インデント Iteratorパターン
インデント Mediatorパターン
インデント Mementoパターン
インデント Observerパターン
インデント Stateパターン
インデント Strategyパターン
インデント Visitorパターン
インデント 速習!デザインパターン第一回
インデント 速習!デザインパターン第二回
インデント 速習!デザインパターン第三回
インデント UMLとは
インデント UML入門
インデント オブジェクト指向
インデント クラス図
インデント アクティビティ図
インデント インタラクション図
インデント ユースケース図
インデント Rarestyle証明書サービス
インデント QRコード発行WSDL
インデント QRコード発行サンプル
インデント J2EE覚書
インデント FreeMind実践レポート
インデント モバイル情報
インデント Homeページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

Visitorパターン (デザインパターン)

Visitorパターン 導入

Visitorパターンは外部のオブジェクトがデータ構造を訪問しながら、個々の要素を処理するパターンです。

Visitorパターン

Visitorクラスは、データ構造の各要素(Element)にVisitorを受け入れるインターフェースを実装します。 複数のVisitorの対応を考えて、抽象化します。データ構造には異なった種類の要素が存在することが予測されること より、Elementも抽象化して、抽象Visitorを受け入れるようにします。

Visitorパターン ポイント

データ構造と処理方法を切り離します。

UML Visitorパターン

C#ソースコード Visitorパターン

Sample.cs

using System;
using System.Collections;

namespace Visitor
{
   //----------------------------------------------------------------
   //  デザインパターン Visitor
   //
   //      外部のオブジェクトがデータ構造を訪問しながら、データ構造内の
   //      個々の要素を処理するパターン
   //
   //----------------------------------------------------------------

   //抽象訪問者の定義
   public abstract class Visitor
   {
       //各要素を訪問した時に実行する処理のインタフェースを
       //定義

       //要素spanを訪問した時の処理
       public abstract void VisitConcreteElementA(ConcreteElementA EleA);
       //要素Bを訪問した時の処理
       public abstract void VisitConcreteElementB(ConcreteElementB EleB);
   }

   public class ConcreteVisitor1 : Visitor
   {
       public override void VisitConcreteElementA(ConcreteElementA EleA)
       {
           Console.WriteLine("要素spanが具象Visito1によって訪問されました");
           Console.WriteLine("\t\t お名前は:" + EleA.Name +"ですね");
       }
       public override void VisitConcreteElementB(ConcreteElementB EleB)
       {
           Console.WriteLine("要素Bが具象Visito1によって訪問されました");
           Console.WriteLine("\t\t ご年齢は:" + EleB.Age.ToString() +"ですね");
       }
   }

   public class ConcreteVisitor2 : Visitor
   {
       public override void VisitConcreteElementA(ConcreteElementA EleA)
       {
           Console.WriteLine("要素spanが具象Visito2によって訪問されました");
           Console.WriteLine("\t\t あんたの名前は:" + EleA.Name +"やろう");
       }
       public override void VisitConcreteElementB(ConcreteElementB EleB)
       {
           Console.WriteLine("要素Bが具象Visito2によって訪問されました");
           Console.WriteLine("\t\t としは:" + EleB.Age.ToString() +"やねえ");
       }
   }

   //要素(抽象クラスで定義)
   //Visitorを受け入れるインターフェースを定義します。
   public abstract class Element
   {
       public abstract void Accept(Visitor Vis);
   }


   //具象要素クラス(span)
   public class ConcreteElementA :Element
   {
       //例(名前 プロパティに保持)
       private string strName;
       public ConcreteElementA(string strName )
       {
           this.strName=strName;
       }
       public string Name
       {
           get{return this.strName;}
       }

       public override void Accept(Visitor Vis)
       {
           Vis.VisitConcreteElementA(this);
       }
       //何か処理を記述します。
       public void operationA()
       {
       }
   }

   //具象要素クラス(B)
   public class ConcreteElementB :Element
   {
       //例(年齢 プロパティに保持)
       private int intAge;
       public ConcreteElementB(int intAge)
       {
           this.intAge=intAge;
       }
       public int Age
       {
           get{return this.intAge;}
       }
       public override void Accept(Visitor Vis)
       {
           Vis.VisitConcreteElementB(this);
       }
       //何か処理を記述します。
       public void operationB()
       {
       }
   }


   //データ構造
   //とりあえず要素を入れて保持できるもので考えてみる
   public class ObjectStructure
   {
       private ArrayList Ary =new ArrayList();

       public void Add(Element Elm)
       {
           Ary.Add(Elm);
       }
       public void Remove(Element Elm)
       {
           Ary.Remove(Elm);
       }

       public void VisitorOperation(Visitor Vis)
       {
           foreach(Element e in Ary)
           {
               e.Accept(Vis);
           }
       }
   }

   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
           //データ構造のインスタンス定義
           ObjectStructure Structure =new ObjectStructure();
           //要素の作成
           ConcreteElementA Ele_A =new ConcreteElementA("ひでお");
           ConcreteElementB Ele_B =new ConcreteElementB(39);
           //データ構造のセット
           Structure.Add(Ele_A);
           Structure.Add(Ele_B);

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

           //データ構造からVisitorを訪問させる
           Structure.VisitorOperation(v1);
           Structure.VisitorOperation(v2);
        }
   }
}

Visitor 実行結果

UMLプラグインによる描画 Visitorパターン

Javaソースコード Visitorパターン

ObjectStructure.java
   1: package visitor;
   2: 
   3: import java.util.ArrayList;
   4: import java.util.Iterator;
   5: 
   6: public class ObjectStructure {
   7: 
   8:     private ArrayList elements=new ArrayList();
   9: 
  10:     public void remove(Element element) {
  11:         this.elements.remove(element);
  12:     }
  13: 
  14:     public void addElement(Element element) {
  15:         this.elements.add(element);
  16:     }
  17: 
  18:     public void visitorOperation(Visitor visitor) {
  19:         Iterator itr =this.elements.iterator();
  20:         while(itr.hasNext()){
  21:             
  22:             ((Element)itr.next()).accept(visitor);
  23:             
  24:         }
  25:     }
  26: }
Element.java
   1: package visitor;
   2: 
   3: public abstract class Element {
   4: 
   5:     /**
   6:      * //要素にVisitorを受け入れるようにします。
   7:      */
   8:     public abstract void accept(Visitor visitor);
   9: 
  10: }
ConcreteElementA.java
   1: package visitor;
   2: 
   3: public class ConcreteElementA extends Element {
   4: 
   5:     private String Name;
   6: 
   7:     public void accept(Visitor visitor) {
   8:         visitor.visitConcreteElementA(this);
   9:     }
  10: 
  11:     public String getName() {
  12:         return Name;
  13:     }
  14: 
  15:     public void setName(String Name) {
  16:         this.Name = Name;
  17:     }
  18: 
  19:     public void operationA() {
  20:     }
  21: 
  22: }
ConcreteElementB.java
   1: package visitor;
   2: 
   3: public class ConcreteElementB extends Element {
   4: 
   5:     private int Age;
   6: 
   7:     public void accept(Visitor visitor) {
   8:         visitor.visitConcreteElementB(this);
   9:     }
  10: 
  11:     public int getAge() {
  12:         return Age;
  13:     }
  14: 
  15:     public void setAge(int Age) {
  16:         this.Age = Age;
  17:     }
  18: 
  19:     public void operationB() {
  20:     }
  21: 
  22: }
Visitor.java
   1: package visitor;
   2: 
   3: public abstract class Visitor {
   4: 
   5:     public abstract void visitConcreteElementA(ConcreteElementA elementA);
   6: 
   7:     public abstract void visitConcreteElementB(ConcreteElementB elementB);
   8: 
   9: }
ConcreteVisitor1.java
   1: package visitor;
   2: 
   3: public class ConcreteVisitor1 extends Visitor {
   4: 
   5:     /*
   6:      * 要素spanを訪問した時の処理
   7:      */
   8:     public void visitConcreteElementA(ConcreteElementA elementA) {
   9:         System.out.println("要素spanが具象Visitor1によって訪問されました");
  10:         System.out.println("\t\t お名前は"+ elementA.getName() +"ですね");
  11:     }
  12: 
  13:     /* 
  14:      * 要素Bを訪問した時の処理
  15:      */
  16:     public void visitConcreteElementB(ConcreteElementB elementB) {
  17:         System.out.println("要素Bが具象Visitor1によって訪問されました");
  18:         System.out.println("\t\t ご年齢は"+ elementB.getAge() +"ですね");
  19:     }
  20: 
  21: }
ConcreteVisitor2.java
   1: package visitor;
   2: 
   3: public class ConcreteVisitor2 extends Visitor {
   4: 
   5:     /* 
   6:      * 要素spanを訪問した時の処理
   7:      */
   8:     public void visitConcreteElementA(ConcreteElementA elementA) {
   9:         System.out.println("要素spanが具象Visitor2によって訪問されました");
  10:         System.out.println("\t\t あんたの名前は"+ elementA.getName() +"やろう");
  11:     }
  12: 
  13:     /* 
  14:      * 要素Bを訪問した時の処理
  15:      */
  16:     public void visitConcreteElementB(ConcreteElementB elementB) {
  17:         System.out.println("要素Bが具象Visitor2によって訪問されました");
  18:         System.out.println("\t\t としは"+ elementB.getAge() +"やねえ");
  19:     }
  20: 
  21: }
StartClass.java
   1: package visitor;
   2: 
   3: public class StartClass {
   4: 
   5:     public static void main(String[] args) {
   6:         
   7:         //データ構造のインスタンス作成
   8:         ObjectStructure structure =new ObjectStructure();
   9:         //要素の作成
  10:         ConcreteElementA elementA =new ConcreteElementA();
  11:         ConcreteElementB elementB =new ConcreteElementB();
  12:         elementA.setName("山田太郎");
  13:         elementB.setAge(18);
  14:         //要素をデータ構造へ追加
  15:         structure.addElement(elementA);
  16:         structure.addElement(elementB);
  17:         
  18:         //Visitorインスタンスの生成
  19:         ConcreteVisitor1 visitor1 =new ConcreteVisitor1();
  20:         ConcreteVisitor2 visitor2 =new ConcreteVisitor2();
  21:     
  22:         structure.visitorOperation(visitor1);
  23:         structure.visitorOperation(visitor2);
  24:     }
  25: }



コミュニティマーカーデザインパターン「ひとくちメモ」へ

コミュニティマーカーHomeへもどる

お天気情報
東京都 東京 - 今日の天気
晴れ - リンク先
最高 最低
気温 14 -
湿度 57.2 -
取得日:2010/03/12 11:00:00  ST: True
東京都 東京 - 明日の天気
曇時々晴 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2010/03/12 5:00:00  ST: True
東京都 東京 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 12 6
湿度 53.6 42.8
取得日:2010/03/11 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴れ - リンク先
最高 最低
気温 16 -
湿度 60.8 -
取得日:2010/03/12 5:00:00  ST: True
大阪府 大阪 - 明日の天気
曇時々晴 - リンク先
最高 最低
気温 16 10
湿度 60.8 50
取得日:2010/03/12 11:00:00  ST: True
大阪府 大阪 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 17 6
湿度 62.6 42.8
取得日:2010/03/11 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索