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)