最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例
时间:2022-06-25 04:33:12 编辑:袖梨 来源:一聚教程网
本文实例讲述了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#的反射 来实现 复杂点的 访问者模式 。
相关文章
- 江南百景图碎金泉怎么样 12-26
- 江南百景图游宴廊怎么样 江南百景图游宴廊建筑介绍 12-26
- 江南百景图碎金泉怎么样 江南百景图碎金泉建筑介绍 12-26
- 炉石传说兑换码大全 12-26
- 重返未来1999趋光性研究夜幕之外怎么玩 趋光性夜幕之外活动介绍 12-26
- 光遇12.26大蜡烛在哪里 光遇12月26日大蜡烛位置攻略 12-26