码迷,mamicode.com
首页 > 其他好文 > 详细

行为型模式(九)访问者模式

时间:2015-12-01 00:04:54      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

 

一句话的概要

数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者传入对象,访问者则执行方法

剧情

小明见完女神的妈妈,就准备带女神来一次说走就走的旅行。

女神有一个衣柜,里面什么衣服都有。只要小明告诉她去哪里,他就准备对应的衣服。

这里我们的衣柜就是访问者,我们的小明组织去哪里玩,就是数据节点。

小明把去哪里玩,告诉访问者,访问者准备衣服,并且同意去玩。

我们用访问者模式,来构造以上情景。

任务一:创建访问者

我们定义访问者接口,也就是女神的衣柜接口

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!