/*Visitor訪問者模式定義
作用於某個對象羣中各個對象的操作. 它可以使你在不改變這些對象本身的情況下,定義作用於這些對象的新操作.
在Java中,Visitor模式實際上是分離了collection結構中的元素和對這些元素進行操作的行爲.
爲何使用Visitor?
Java的Collection(包括Vector和Hashtable)是我們最經常使用的技術,可是Collection好象是個黑色大染缸,本來有各種鮮明類型特徵的對象一旦放入後,再取出時,這些類型就消失了.那麼我們勢必要用If來判斷,如:
Iterator iterator = collection.iterator()
while (iterator.hasNext())
{
Object o = iterator.next();
if (o instanceof Collection)
messyPrintCollection((Collection)o);
else if (o instanceof String)
System.out.println("'"+o.toString()+"'");
else if (o instanceof Float)
System.out.println(o.toString()+"f");
else
System.out.println(o.toString());
}
在上例中,我們使用了 instanceof來判斷 o的類型.
很顯然,這樣做的缺點代碼If else if 很繁瑣.我們就可以使用Visitor模式解決它.
*/
using System;
using System.Collections ;
namespace Pattern
{
/// <summary>
/// Summary description for Class1.
/// </summary>
public interface Visitable
{
void accept(Visitor visitor);
}
public class StringElement : Visitable
{
private String v;
public StringElement(string str)
{
v = str;
}
public String getValue()
{
return v;
}
//定義accept的具體內容 這裏是很簡單的一句調用
public void accept(Visitor visitor)
{
visitor.visitString(this);
}
}
public class FloatElement : Visitable
{
private float m_f;
public FloatElement(float f)
{
this.m_f = f;
}
public float getValue()
{
return m_f;
}
//定義accept的具體內容 這裏是很簡單的一句調用
public void accept(Visitor visitor)
{
visitor.visitFloat(this);
}
}
public interface Visitor
{
void visitString(StringElement stringE);
void visitFloat(FloatElement floatE);
void visitCollection(IList collection);
}
public class ConcreteVisitor : Visitor
{
//在本方法中,我們實現了對Collection的元素的成功訪問
public void visitCollection(IList collection)
{
IEnumerator iterator = collection.GetEnumerator();
while (iterator.MoveNext ())
{
Object o = iterator.Current;
if (o is Visitable)
((Visitable)o).accept(this);
}
}
public void visitString(StringElement stringE)
{
System.Console .WriteLine ("'"+stringE.getValue()+"'");
}
public void visitFloat(FloatElement floatE)
{
System.Console .WriteLine (floatE.getValue().ToString()+"f");
}
}
}
//訪問者模式
// Visitor visitor = new ConcreteVisitor();
//
// StringElement stringE = new StringElement("I am a String");
// visitor.visitString(stringE);
//
//
// System.Collections . ArrayList list = new System.Collections.ArrayList();
// list.Add (new StringElement("I am a String1"));
// list.Add(new StringElement("I am a String2"));
// list.Add(new FloatElement(12));
// list.Add(new StringElement("I am a String3"));
// visitor.visitCollection(list);