重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本文实例讲述了C#设计模式之Visitor访问者模式解决长隆欢乐世界问题。分享给大家供大家参考,具体如下:
创新互联凭借在网站建设、网站推广领域领先的技术能力和多年的行业经验,为客户提供超值的营销型网站建设服务,我们始终认为:好的营销型网站就是好的业务员。我们已成功为企业单位、个人等客户提供了成都网站建设、网站制作服务,以良好的商业信誉,完善的服务及深厚的技术力量处于同行领先地位。
一、理论定义
访问者模式 提供了 一组 集合 对象 统一的 访问接口,适合对 一个集合中的对象,进行逻辑操作,使 数据结构 和 逻辑结构分离。
二、应用举例
需求描述:暑假来啦!三个小伙子组团,开车来 长隆欢乐世界玩。
每个人想玩的项目都不一样,
旅游者 1 想玩:十环过山车,龙卷风暴,梦幻旋马
旅游者 2 想玩:空中警察,欢乐摩天轮,超级水战
旅游者 3 想玩:四维影院,垂直极限,U型滑板
车开到长隆后,就开始各自Enjoy啦!!!
三、具体编码
1.一个旅游者接口,里面有一个Play游玩 方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Com.Design.Gof.Visitor { public interface ITourist { ////// 游玩 /// /// 长隆欢乐世界 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; ////// 游玩的项目 /// 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 { ////// 长隆欢乐世界 /// public class ChangLongHappyWorld { ////// 接待各个访问者 /// /// 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 { ////// 旅游者 1 想玩:十环过山车,龙卷风暴,梦幻旋马 /// public class TouristOne : ITourist { ////// 十环过山车 /// [PlayAttribute(PlayItem = "TenthRingRollerCoaster")] public void Play_TenthRingRollerCoaster() { Console.WriteLine("我是游客1,我现在玩的是:十环过山车"); } ////// 龙卷风暴 /// [PlayAttribute(PlayItem = "TornadoStorm")] public void Play_TornadoStorm() { Console.WriteLine("我是游客1,我现在玩的是:龙卷风暴"); } ////// 梦幻旋马 /// [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 { ////// 旅游者 2 想玩:空中警察,欢乐摩天轮,超级水战 /// public class TouristTwo : ITourist { ////// 空中警察 /// [PlayAttribute(PlayItem = "AirPolice")] public void Play_AirPolice() { Console.WriteLine("我是游客2,我现在玩的是:空中警察"); } ////// 欢乐摩天轮 /// [PlayAttribute(PlayItem = "FerrisWheel")] public void Play_FerrisWheel() { Console.WriteLine("我是游客2,我现在玩的是:欢乐摩天轮"); } ////// 超级水战 /// [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 { ////// 旅游者 3 想玩:四维影院,垂直极限,U型滑板 /// public class TouristThree : ITourist { ////// 四维影院 /// [PlayAttribute(PlayItem = "AirPolice")] public void Play_Cinema4D() { Console.WriteLine("我是游客3,我现在玩的是:四维影院"); } ////// 垂直极限 /// [PlayAttribute(PlayItem = "VerticalLimit")] public void Play_VerticalLimit() { Console.WriteLine("我是游客3,我现在玩的是:垂直极限"); } ////// U型滑板 /// [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) { //三个小伙子,开车到长隆欢乐世界 游玩, 每个人想玩的项目都不一样。 Listlist = new List { 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#的反射 来实现 复杂点的 访问者模式 。
附:完整实例代码点击此处本站下载。
更多关于C#相关内容还可查看本站专题:《C#数据结构与算法教程》、《C#窗体操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程》
希望本文所述对大家C#程序设计有所帮助。