标签:
数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者传入对象,访问者则执行方法。
小明见完女神的妈妈,就准备带女神来一次说走就走的旅行。
女神有一个衣柜,里面什么衣服都有。只要小明告诉她去哪里,他就准备对应的衣服。
这里我们的衣柜就是访问者,我们的小明组织去哪里玩,就是数据节点。
小明把去哪里玩,告诉访问者,访问者准备衣服,并且同意去玩。
我们用访问者模式,来构造以上情景。
我们定义访问者接口,也就是女神的衣柜接口
public interface IVisual { void Play(Beach b); void Play(Snow s); }
接下来,我们实现这个接口
public class NvShen : IVisual { public void Play(Snow s) { Console.WriteLine("我要准备羽绒服"); s.Go(); } public void Play(Beach b) { Console.WriteLine("我要准备泳装"); b.Go(); } }
这里的Play是个重载,根据数据结构的不同,做出的反应也不同。我们让他做出不同反应之后,同时调用出发的这个方法。
我们创建小明和他组织的两处地方,雪山和沙滩
//小明组织出去玩 public abstract class SomeM { public abstract void Accept(IVisual vistor); public abstract void Go(); } //去沙滩 public class Beach : SomeM { public override void Accept(IVisual vistor) { vistor.Play(this); } public override void Go() { Console.WriteLine("出发去海边玩"); } } //去雪山 public class Snow : SomeM { public override void Accept(IVisual vistor) { vistor.Play(this); } public override void Go() { Console.WriteLine("出发去雪山玩"); } }
这里我们会把自身对象传给访问者。然后定义由访问者执行的方法。
我们初始化一下,填充数据。
public class GoToPlay { public SomeM m; public GoToPlay() { Random dom = new Random(); int num = dom.Next(3); if (num <= 1) { m = new Beach(); } else { m = new Snow(); } } }
这里使用了随机数,50%的几率去不同的地方。
然后我们调用这些方法。
private static void Main(string[] args) { GoToPlay play = new GoToPlay(); SomeM m = play.m; m.Accept(new NvShen()); Console.ReadLine(); }
数据结构的每一个节点都可以接受一个访问者的调用。此节点向访问者传递对象,而访问者反过来执行对象的方法。
常用场景:作用于一个数据结构之上的操作经常变化。
选择关键点:数据结构是否稳定以及操作是否经常变化。
By~ 下一节:行为型模式(十)备忘录模式
标签:
原文地址:http://www.cnblogs.com/chenxygx/p/5004457.html