|
Rarestyleへようこそ
|
|
|
|
|
|
デザインパターンでキャリアアップ
|
Visitorパターン (デザインパターン)
Visitorパターン 導入
Visitorパターンは外部のオブジェクトがデータ構造を訪問しながら、個々の要素を処理するパターンです。
Visitorクラスは、データ構造の各要素(Element)にVisitorを受け入れるインターフェースを実装します。 複数のVisitorの対応を考えて、抽象化します。データ構造には異なった種類の要素が存在することが予測されること
より、Elementも抽象化して、抽象Visitorを受け入れるようにします。
Visitorパターン ポイント
データ構造と処理方法を切り離します。
UML Visitorパターン
C#ソースコード Visitorパターン
|
Sample.cs
|
|
using System;
using System.Collections;
namespace Visitor
{
public
abstract class Visitor
{
public
abstract void VisitConcreteElementA(ConcreteElementA
EleA);
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()
+"やねえ");
}
}
public
abstract class Element
{
public
abstract void Accept(Visitor
Vis);
}
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()
{
}
}
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);
}
}
}
class
Class1
{
[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();
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へもどる
|
|
| お天気情報 |
|
東京都 東京 - 今日の天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
東京都 東京 - 明日の天気
|
晴時々曇
-
|
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
東京都 東京 - あさっての天気
|
曇時々晴
-
|
|
|
最高
|
最低
|
| 気温
|
34 |
27 |
| 湿度
|
93.2 |
80.6 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
大阪府 大阪 - 今日の天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
大阪府 大阪 - 明日の天気
|
晴れ
-
|
|
|
|
|
取得日:2010/09/04 5:00:00
ST:
True |
|
|
大阪府 大阪 - あさっての天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
| livedoorのWebサービスより提供 |
|
【工事中】お天気配信 ユーザー登録 |
|
|
|
|
|
Internet Explorer5.0以上のご利用を推奨いたします。
|
 |
Copyright 2006 Rarestyle
このページへのリンクは確認不要です。
Programming by Xenon Project Team
postmaster@rarestyle.net
免責事項について
|