这篇文章主要介绍了C#设计模式之Visitor访问者模式解决长隆欢乐世界问题,简单描述了访问者模式的定义并结合具体实例形式分析了C#使用访问者模式解决长隆欢乐世界问题的具体实现技巧,需要的朋友可以参考下
本文实例讲述了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
{
/// <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#的反射 来实现 复杂点的 访问者模式 。
附:完整实例代码点击此处本站下载。
更多关于C#相关内容还可查看本站专题:《C#数据结构与算法教程》、《C#窗体操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程》
希望本文所述对大家C#程序设计有所帮助。
本文标题为:C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例
基础教程推荐
- C# List实现行转列的通用方案 2022-11-02
- 一个读写csv文件的C#类 2022-11-06
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- ZooKeeper的安装及部署教程 2023-01-22
- C#类和结构详解 2023-05-30
- unity实现动态排行榜 2023-04-27
- C# 调用WebService的方法 2023-03-09
- winform把Office转成PDF文件 2023-06-14
- C#控制台实现飞行棋小游戏 2023-04-22
- C# windows语音识别与朗读实例 2023-04-27