using System; using System.Collections.Generic; using System.Text; ///Visitor(访问者)模式 用于表示一个作用于某对象结构中的各元素的操作,在不改变各元素的类的前提下定义作用于这些元素的新操作。 ///add by jzh 2007-04-15 namespace DesignPattern { /// <summary> /// Visitor(访问者):为该对象结构中ConcreteElement的每一个类声明一个Visit操作。 /// 该操作的名字和特征标识了发送Visit请求给该访问者的那个类。 /// 这使得访问者可以确定正被访问元素的具体的类。 /// 这样访问者就可以通过该元素的特定接口直接访问它。 /// </summary> abstract class Visitor { abstract public void VisitElementA(ConcreteElementA a); abstract public void VisitElementB(ConcreteElementB b); } /// <summary> /// ConcreteVisitor(具体访问者):实现每个由Visitor声明的操作。 /// 每个操作实现本算法的一部分,而该算法片断乃是对应于结构中对象的类。 /// ConcreteVisitor为该算法提供了上下文并存储它的局部状态, /// 这一状态常常在遍历该结构的过程中累积结果。 /// </summary> class ConcreteVisitor1 : Visitor { override public void VisitElementA(ConcreteElementA a) { Console.WriteLine("访问A"); } override public void VisitElementB(ConcreteElementB b) { Console.WriteLine("访问2"); } } /// <summary> /// Element(元素):定义一个Accept操作,它以一个访问者为参数。 /// </summary> abstract class Element { abstract public void Accept(Visitor v); } /// <summary> /// ConcreteElement(具体元素):实现Accept操作,该操作以一个访问者为参数。 /// </summary> class ConcreteElementA : Element { public Visitor myVisitor; override public void Accept(Visitor v) { myVisitor = v; } public void OperationA() { } public void DoSomeWork() { myVisitor.VisitElementA(this); Console.WriteLine("做点什么"); } } class ConcreteElementB : Element { override public void Accept(Visitor v) { } public void OperationB() { } } public class Client { public static void Main(string[] args) { ConcreteElementA eA = new ConcreteElementA(); ConcreteElementB eB = new ConcreteElementB(); ConcreteVisitor1 v1 = new ConcreteVisitor1(); eA.Accept(v1); eA.DoSomeWork(); Console.ReadLine(); } } }