C#设计模式系列 4 ----Visitor 访问者模式 之--长隆欢乐世界

   1.理论定义

        访问者模式 提供了 一组 集合 对象 统一的 访问接口,适合对 一个集合中的对象,进行逻辑操作,使 数据结构  和 逻辑结构分离。

   2.应用举例

          需求描述:暑假来啦!三个小伙子组团,开车来 长隆欢乐世界玩。

                        每个人想玩的项目都不一样,

                        旅游者 1   想玩:十环过山车,龙卷风暴,梦幻旋马

                        旅游者 2   想玩:空中警察,欢乐摩天轮,超级水战

                        旅游者 3   想玩:四维影院,垂直极限,U型滑板

                        车开到长隆后,就开始各自Enjoy啦!!!

   3.具体编码

         1.一个旅游者接口,里面有一个Play游玩 方法

    

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.Visitor
{
    public interface ITourist
    {
        /// <summary>
        /// 游玩
        /// </summary>
        /// <param name="happyWorld">长隆欢乐世界</param>
         void Play(ChangLongHappyWorld happyWorld);
    }
}

2.每个人要玩什么项目,都有一个标志

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.Visitor
{
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
    public class PlayAttribute : Attribute
    {
        private string _PlayItem;
        /// <summary>
        /// 游玩的项目
        /// </summary>
        public string PlayItem
        {
            get { return _PlayItem; }
            set { _PlayItem = value; }
        }
    }
}

 

3.长隆欢乐世界

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace Com.Design.Gof.Visitor
{
    /// <summary>
    /// 长隆欢乐世界
    /// </summary>
    public class ChangLongHappyWorld
    {
        /// <summary>
        /// 接待各个访问者
        /// </summary>
        /// <param name="visitor"></param>
        public void visit(ITourist visitor) {
            //每个旅游者想玩的项目不一样。使用反射,方便调用
            MethodInfo[] method = visitor.GetType().GetMethods();
            foreach (MethodInfo m in method) {
                object[] property= m.GetCustomAttributes(false);
                string customerAttribute = null;
                if (property.Length>0) {
                   customerAttribute = property[0].ToString();
                }
                if (customerAttribute == "Com.Design.Gof.Visitor.PlayAttribute")
                {
                    m.Invoke(visitor, new object[] { });
                }
            }
        }
    }
}

4.旅游者  1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.Visitor
{
    /// <summary>
    /// 旅游者 1   想玩:十环过山车,龙卷风暴,梦幻旋马
    /// </summary>
    public class TouristOne : ITourist
    {
        /// <summary>
        /// 十环过山车
        /// </summary>
        [PlayAttribute(PlayItem = "TenthRingRollerCoaster")]
        public void Play_TenthRingRollerCoaster() {
            Console.WriteLine("我是游客1,我现在玩的是:十环过山车");
        }
        /// <summary>
        /// 龙卷风暴
        /// </summary>
         [PlayAttribute(PlayItem = "TornadoStorm")]
        public void Play_TornadoStorm()
        {
            Console.WriteLine("我是游客1,我现在玩的是:龙卷风暴");
        }
        /// <summary>
        /// 梦幻旋马
        /// </summary>
       [PlayAttribute(PlayItem = "DreamHorse")]
        public void Play_DreamHorse()
        {
            Console.WriteLine("我是游客1,我现在玩的是:梦幻旋马");
        }
        public void Play(ChangLongHappyWorld happyWorld)
        {
            happyWorld.visit(this);
        }
    }
}

5.旅游者 2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.Visitor
{
    /// <summary>
    /// 旅游者 2   想玩:空中警察,欢乐摩天轮,超级水战
    /// </summary>
    public class TouristTwo : ITourist
    {
        /// <summary>
        /// 空中警察
        /// </summary>
        [PlayAttribute(PlayItem = "AirPolice")]
        public void Play_AirPolice() {
            Console.WriteLine("我是游客2,我现在玩的是:空中警察");
        }
        /// <summary>
        /// 欢乐摩天轮
        /// </summary>
        [PlayAttribute(PlayItem = "FerrisWheel")]
        public void Play_FerrisWheel()
        {
            Console.WriteLine("我是游客2,我现在玩的是:欢乐摩天轮");
        }
        /// <summary>
        /// 超级水战
        /// </summary>
        [PlayAttribute(PlayItem = "SuperWater")]
        public void Play_SuperWater()
        {
            Console.WriteLine("我是游客2,我现在玩的是:超级水战");
        }
        public void Play(ChangLongHappyWorld happyWorld)
        {
            happyWorld.visit(this);
        }
    }
}

6.旅游者 3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.Visitor
{
    /// <summary>
    /// 旅游者 3   想玩:四维影院,垂直极限,U型滑板
    /// </summary>
    public class TouristThree : ITourist
    {
        /// <summary>
        /// 四维影院
        /// </summary>
        [PlayAttribute(PlayItem = "AirPolice")]
        public void Play_Cinema4D() {
            Console.WriteLine("我是游客3,我现在玩的是:四维影院");
        }
        /// <summary>
        /// 垂直极限
        /// </summary>     
        [PlayAttribute(PlayItem = "VerticalLimit")]
        public void Play_VerticalLimit()
        {
            Console.WriteLine("我是游客3,我现在玩的是:垂直极限");
        }
        /// <summary>
        /// U型滑板
        /// </summary>
        [PlayAttribute(PlayItem = "UShapeSkateboard")]
        public void Play_UShapeSkateboard()
        {
            Console.WriteLine("我是游客3,我现在玩的是:U型滑板");
        }
        public void Play(ChangLongHappyWorld happyWorld)
        {
            happyWorld.visit(this);
        }
    }
}

7.主函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Com.Design.Gof.Visitor;
namespace Com.Design.Gof.Test
{
    class Program
    {

        static void Main(string[] args)
        {
            //三个小伙子,开车到长隆欢乐世界 游玩, 每个人想玩的项目都不一样。
            List<ITourist> list = new List<ITourist> { 
             new TouristOne(), 
             new TouristTwo(),
             new TouristThree()
            };
            //车开到了长隆  南大门,长隆到了
            ChangLongHappyWorld happyWorld = new ChangLongHappyWorld();

            //开始  游玩 长隆啦!!
            foreach (var visit in list) {
                visit.Play(happyWorld);
                Console.WriteLine("------------------------------------------------");
            }
            Console.ReadKey();
        }

    }
}

8.运行结果

9.总结

  运用C#的反射 来实现 复杂点的 访问者模式 。

  附件里面包括了程序源码。

  这里是附件下载(Download)

posted @ 2012-08-02 12:06  正定聚  阅读(1135)  评论(5编辑  收藏  举报