访问者(Visitor)模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。
/*
* 抽象访问者(Visitor)角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口。
* 具体访问者(ConcreteVisitor)角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作。
* 抽象节点(Node)角色:声明一个接受操作,接受一个访问者对象作为一个参量。
* 具体节点(Node)角色:实现了抽象元素所规定的接受操作。
* 结构对象(ObiectStructure)角色:有如下的一些责任,可以遍历结构中的所有元素;
如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;
如果需要,可以设计成一个复合对象或者一个聚集,如列(List)或集合(Set)。
*/
Console.WriteLine("//===============//"); ObjectStructures o2 = new ObjectStructures(); o2.Attach(new Man()); o2.Attach(new Woman()); Success s = new Success(); o2.Accept(s); //失败时候.... /// <summary> /// 状态抽象类 抽象访问者(Visitor) /// </summary> public abstract class Action { //得到男人结论 public abstract void GetManConclusion(Man man); //得到女人结论 public abstract void GetWomanConclusion(Woman woman); } /// <summary> /// 人抽象类 抽象节点(Node) /// </summary> public abstract class Person { //接受 public abstract void Accept(Action action); } /// <summary> /// 具体访问者 /// </summary> public class Success : Action { public override void GetManConclusion(Man man) { Console.WriteLine("{0} {1} 时,背后多半有一个伟大的女人。", man.GetType().Name,this.GetType().Name); } public override void GetWomanConclusion(Woman woman) { Console.WriteLine("{0} {1} 时,背后多半有一个不成功的男人。", woman.GetType().Name, this.GetType().Name); } } public class Man : Person { public override void Accept(Action action) { action.GetManConclusion(this); } } public class Woman : Person { public override void Accept(Action action) { action.GetWomanConclusion(this); } } //结构对象(ObiectStructure)角色 public class ObjectStructures { private ArrayList elements = new ArrayList(); public void Attach(Person element) { elements.Add(element); } public void Detach(Person element) { elements.Remove(element); } public void Accept(Action visitor) { foreach (Person e in elements) e.Accept(visitor); } }