/*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);