C#設(shè)計(jì)模式之Visitor訪問者模式解決長隆歡樂世界問題實(shí)例
本文實(shí)例講述了C#設(shè)計(jì)模式之Visitor訪問者模式解決長隆歡樂世界問題。分享給大家供大家參考,具體如下:
一、理論定義
訪問者模式 提供了 一組 集合 對象 統(tǒng)一的 訪問接口,適合對 一個集合中的對象,進(jìn)行邏輯操作,使 數(shù)據(jù)結(jié)構(gòu) 和 邏輯結(jié)構(gòu)分離。
二、應(yīng)用舉例
需求描述:暑假來啦!三個小伙子組團(tuán),開車來 長隆歡樂世界玩。
每個人想玩的項(xiàng)目都不一樣,
旅游者 1 想玩:十環(huán)過山車,龍卷風(fēng)暴,夢幻旋馬
旅游者 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
{
/// <summary>
/// 游玩
/// </summary>
/// <param name="happyWorld">長隆歡樂世界</param>
void Play(ChangLongHappyWorld happyWorld);
}
}
2.每個人要玩什么項(xiàng)目,都有一個標(biāo)志
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>
/// 游玩的項(xiàng)目
/// </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) {
//每個旅游者想玩的項(xiàng)目不一樣。使用反射,方便調(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
{
/// <summary>
/// 旅游者 1 想玩:十環(huán)過山車,龍卷風(fēng)暴,夢幻旋馬
/// </summary>
public class TouristOne : ITourist
{
/// <summary>
/// 十環(huán)過山車
/// </summary>
[PlayAttribute(PlayItem = "TenthRingRollerCoaster")]
public void Play_TenthRingRollerCoaster() {
Console.WriteLine("我是游客1,我現(xiàn)在玩的是:十環(huán)過山車");
}
/// <summary>
/// 龍卷風(fēng)暴
/// </summary>
[PlayAttribute(PlayItem = "TornadoStorm")]
public void Play_TornadoStorm()
{
Console.WriteLine("我是游客1,我現(xiàn)在玩的是:龍卷風(fēng)暴");
}
/// <summary>
/// 夢幻旋馬
/// </summary>
[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
{
/// <summary>
/// 旅游者 2 想玩:空中警察,歡樂摩天輪,超級水戰(zhàn)
/// </summary>
public class TouristTwo : ITourist
{
/// <summary>
/// 空中警察
/// </summary>
[PlayAttribute(PlayItem = "AirPolice")]
public void Play_AirPolice() {
Console.WriteLine("我是游客2,我現(xiàn)在玩的是:空中警察");
}
/// <summary>
/// 歡樂摩天輪
/// </summary>
[PlayAttribute(PlayItem = "FerrisWheel")]
public void Play_FerrisWheel()
{
Console.WriteLine("我是游客2,我現(xiàn)在玩的是:歡樂摩天輪");
}
/// <summary>
/// 超級水戰(zhàn)
/// </summary>
[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
{
/// <summary>
/// 旅游者 3 想玩:四維影院,垂直極限,U型滑板
/// </summary>
public class TouristThree : ITourist
{
/// <summary>
/// 四維影院
/// </summary>
[PlayAttribute(PlayItem = "AirPolice")]
public void Play_Cinema4D() {
Console.WriteLine("我是游客3,我現(xiàn)在玩的是:四維影院");
}
/// <summary>
/// 垂直極限
/// </summary>
[PlayAttribute(PlayItem = "VerticalLimit")]
public void Play_VerticalLimit()
{
Console.WriteLine("我是游客3,我現(xiàn)在玩的是:垂直極限");
}
/// <summary>
/// U型滑板
/// </summary>
[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)
{
//三個小伙子,開車到長隆歡樂世界 游玩, 每個人想玩的項(xiàng)目都不一樣。
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.運(yùn)行結(jié)果
9.總結(jié)
運(yùn)用C#的反射 來實(shí)現(xiàn) 復(fù)雜點(diǎn)的 訪問者模式 。
附:完整實(shí)例代碼點(diǎ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è)計(jì)入門教程》
希望本文所述對大家C#程序設(shè)計(jì)有所幫助。
欄 目:C#教程
下一篇:詳解C# 匿名對象(匿名類型)、var、動態(tài)類型 dynamic
本文標(biāo)題:C#設(shè)計(jì)模式之Visitor訪問者模式解決長隆歡樂世界問題實(shí)例
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5495.html
您可能感興趣的文章
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10C#一個簡單的定時小程序?qū)崿F(xiàn)代碼
- 01-10微信開放平臺之網(wǎng)站授權(quán)微信登錄功能
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二
- 01-10C#編程自學(xué)之開篇介紹
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量三
- 01-10C#編程自學(xué)之運(yùn)算符和表達(dá)式
- 01-10C#編程自學(xué)之類和對象
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量一
- 01-10C#編程自學(xué)之流程控制語句


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置


