本文實例講述了C#設(shè)計模式之Visitor訪問者模式解決長隆歡樂世界問題。分享給大家供大家參考,具體如下:
創(chuàng)新互聯(lián)憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗,為客戶提供超值的營銷型網(wǎng)站建設(shè)服務(wù),我們始終認為:好的營銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個人等客戶提供了成都網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù),以良好的商業(yè)信譽,完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
一、理論定義
訪問者模式 提供了 一組 集合 對象 統(tǒng)一的 訪問接口,適合對 一個集合中的對象,進行邏輯操作,使 數(shù)據(jù)結(jié)構(gòu) 和 邏輯結(jié)構(gòu)分離。
二、應(yīng)用舉例
需求描述:暑假來啦!三個小伙子組團,開車來 長隆歡樂世界玩。
每個人想玩的項目都不一樣,
旅游者 1 想玩:十環(huán)過山車,龍卷風暴,夢幻旋馬
旅游者 2 想玩:空中警察,歡樂摩天輪,超級水戰(zhàn)
旅游者 3 想玩:四維影院,垂直極限,U型滑板
車開到長隆后,就開始各自Enjoy啦!?。?/p>
三、具體編碼
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) { //每個旅游者想玩的項目不一樣。使用反射,方便調(diào)用 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 想玩:十環(huán)過山車,龍卷風暴,夢幻旋馬 /// public class TouristOne : ITourist { ////// 十環(huán)過山車 /// [PlayAttribute(PlayItem = "TenthRingRollerCoaster")] public void Play_TenthRingRollerCoaster() { Console.WriteLine("我是游客1,我現(xiàn)在玩的是:十環(huán)過山車"); } ////// 龍卷風暴 /// [PlayAttribute(PlayItem = "TornadoStorm")] public void Play_TornadoStorm() { Console.WriteLine("我是游客1,我現(xiàn)在玩的是:龍卷風暴"); } ////// 夢幻旋馬 /// [PlayAttribute(PlayItem = "DreamHorse")] public void Play_DreamHorse() { Console.WriteLine("我是游客1,我現(xiàn)在玩的是:夢幻旋馬"); } 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 想玩:空中警察,歡樂摩天輪,超級水戰(zhàn) /// public class TouristTwo : ITourist { ////// 空中警察 /// [PlayAttribute(PlayItem = "AirPolice")] public void Play_AirPolice() { Console.WriteLine("我是游客2,我現(xiàn)在玩的是:空中警察"); } ////// 歡樂摩天輪 /// [PlayAttribute(PlayItem = "FerrisWheel")] public void Play_FerrisWheel() { Console.WriteLine("我是游客2,我現(xiàn)在玩的是:歡樂摩天輪"); } ////// 超級水戰(zhàn) /// [PlayAttribute(PlayItem = "SuperWater")] public void Play_SuperWater() { Console.WriteLine("我是游客2,我現(xiàn)在玩的是:超級水戰(zhàn)"); } 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,我現(xiàn)在玩的是:四維影院"); } ////// 垂直極限 /// [PlayAttribute(PlayItem = "VerticalLimit")] public void Play_VerticalLimit() { Console.WriteLine("我是游客3,我現(xiàn)在玩的是:垂直極限"); } ////// U型滑板 /// [PlayAttribute(PlayItem = "UShapeSkateboard")] public void Play_UShapeSkateboard() { Console.WriteLine("我是游客3,我現(xiàn)在玩的是:U型滑板"); } public void Play(ChangLongHappyWorld happyWorld) { happyWorld.visit(this); } } }
7.主函數(shù)
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.運行結(jié)果
9.總結(jié)
運用C#的反射 來實現(xiàn) 復雜點的 訪問者模式 。
附:完整實例代碼點擊此處本站下載。
更多關(guān)于C#相關(guān)內(nèi)容還可查看本站專題:《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#窗體操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結(jié)》、《C#數(shù)組操作技巧總結(jié)》及《C#面向?qū)ο蟪绦蛟O(shè)計入門教程》
希望本文所述對大家C#程序設(shè)計有所幫助。