前言
访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变元素的类的前提下定义作用于这些元素的新操作。
一、状态抽象类和人的抽象类
1 //状态抽象类
2 public abstract class Action
3 {
4 //得到男人结论或反应
5 public abstract void GetManConclusion(Man concreteA);
6 //得到女人结论或反应
7 public abstract void GetWomanConclusion(Woman concreteB);
8 }
1 //人抽象类
2 public abstract class Person
3 {
4 //接受
5 public abstract void Accept(Action vistor);
6 }
二、具体的状态类
1 public class Success : Action
2 {
3 public override void GetManConclusion(Man concreteA)
4 {
5 Console.WriteLine("{0}{1}时,有一个伟大的女人", concreteA.GetType().Name, this.GetType().Name);
6 }
7
8 public override void GetWomanConclusion(Woman concreteB)
9 {
10 Console.WriteLine("{0}{1}时,有一个花心的男人", concreteB.GetType().Name, this.GetType().Name);
11 }
12 }
1 public class Fail : Action
2 {
3 public override void GetManConclusion(Man concreteA)
4 {
5 Console.WriteLine("{0}{1}时,有一个败家的女人", concreteA.GetType().Name, this.GetType().Name);
6 }
7
8 public override void GetWomanConclusion(Woman concreteB)
9 {
10 Console.WriteLine("{0}{1}时,有一个勒色的男人", concreteB.GetType().Name, this.GetType().Name);
11 }
12 }
三、男人和女人类
首先在客户程序中将具体状态座位参数传递给“男人” 类完成了一次分派,然后“男人”类调用座位参数的“具体状态” 中的方法“男人反应”,同时将自己(this)作为参数传递进去。这便完成了第二次分派。
1 public class Man : Person
2 {
3
4 public override void Accept(Action vistor)
5 {
6 vistor.GetManConclusion(this);
7 }
8 }
1 public class Woman : Person
2 {
3 public override void Accept(Action vistor)
4 {
5 vistor.GetWomanConclusion(this);
6 }
7 }
四、对象结构类
对象结构类由于总是需要“男人” 与“女人” 在不同状态的对比,所以我们需要一个“对象结构” 类来针对不同的“状态” 遍历“男人”与“女人”,得到不同的反应。
1 //对象结构类
2 public class ObjStructure
3 {
4 private List<Person> elements = new List<Person>();
5
6 public void Attach(Person element)
7 {
8 elements.Add(element);
9 }
10 public void Remove(Person element)
11 {
12 elements.Remove(element);
13 }
14 public void Display(Action vistor)
15 {
16 foreach(var i in elements)
17 {
18 i.Accept(vistor);
19 }
20 }
21 }
五、客户端代码
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 ObjStructure o = new ObjStructure();
6 o.Attach(new Man());
7 o.Attach(new Woman());
8
9 //成功的反应
10 Success e1 = new Success();
11 o.Display(e1);
12
13 //失败时的反应
14 Fail e2 = new Fail();
15 o.Display(e2);
16
17 Console.Read();
18 }
19 }
总结
1、访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,是的操作集合可以相对自由地演化。
2、访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
3、增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
参考模式:大话设计模式