参考《大话模式》
访问者模式:表示一个作用于某对象结构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
它把数据结构和用作于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由演化
访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。
数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作。这样的过程叫做"双重分派"。节点调用访问者,将它自己传入,访问者则将某算法针对此节点执行。
双重分派意味着施加于节点之上的操作是基于访问者和节点本身的数据类型,而不仅仅是其中的一者。
public abstract class Visitor
{
public abstract void VisitorOneElement(OneElement one);
public abstract void VisitorTwoElement(TwoElement Two);
}
public class ConcreteOneVisitor : Visitor
{
public override void VisitorOneElement(OneElement one)
{
Console.WriteLine("{0} visited by {1}",one, this);
}
public override void VisitorTwoElement(TwoElement Two)
{
Console.WriteLine("{0} visited by {1}", Two, this);
}
}
public class ConcreteTwoVisitor : Visitor
{
public override void VisitorOneElement(OneElement one)
{
Console.WriteLine("{0} visited by {1}", one, this);
}
public override void VisitorTwoElement(TwoElement Two)
{
Console.WriteLine("{0} visited by {1}", Two, this);
}
}
public abstract class Element
{
public abstract void Accept(Visitor visitor);
}
public class OneElement : Element
{
public override void Accept(Visitor visitor)
{
visitor.VisitorOneElement(this);
}
}
public class TwoElement : Element
{
public override void Accept(Visitor visitor)
{
visitor.VisitorTwoElement(this);
}
}
//通过该类ObjectStruct把Element和visitor串联
public class ObjectStruct
{
private ArrayList list = new ArrayList();
public void Attach(Element element)
{
list.Add(element);
}
public void Detach(Element element)
{
list.Remove(element);
}
//展示
public void ObjectAccept(Visitor visitor)
{
foreach (Element e in list)
{
e.Accept(visitor);
}
}
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29012686/viewspace-1127125/
,如需转载,请注明出处,否则将追究法律责任。