C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例

发布时间 - 2026-01-11 03:14:23    点击率:

本文实例讲述了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  # 访问者模式  # 长隆欢乐世界问题  # Java 的双重分发与 Visitor 模式实例详解  # 实例讲解iOS应用的设计模式开发中的Visitor访问者模式  # 学习php设计模式 php实现访问者模式(Visitor)  # Java设计模式之访问模式(Visitor者模式)介绍  # php设计模式 Visitor 访问者模式  # C++的命名空间详解  # C++基于OpenCV实现手势识别的源码  # C++内存模型和名称空间详解  # 浅谈 C++17 里的 Visitor 模式  # 的是  # 我是  # 我现在  # 四维  # 都不  # 每个人  # 数据结构  # 龙卷风暴  # 开到  # 程序设计  # 操作技巧  # 都有  # 相关内容  # 给大家  # 点击此处  # 还可  # 人要  # 更多关于  # 来实现  # 所述 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何用西部建站助手快速创建专业网站?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  JS中对数组元素进行增删改移的方法总结  EditPlus中的正则表达式 实战(1)  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  想要更高端的建设网站,这些原则一定要坚持!  nodejs redis 发布订阅机制封装实现方法及实例代码  Angular 表单中正确绑定输入值以确保提交与验证正常工作  大连 网站制作,大连天途有线官网?  如何为不同团队 ID 动态生成多个“认领值班”按钮  ,交易猫的商品怎么发布到网站上去?  Laravel如何创建自定义Facades?(详细步骤)  Java类加载基本过程详细介绍  如何在腾讯云免费申请建站?  Laravel如何处理文件下载请求?(Response示例)  简历在线制作网站免费版,如何创建个人简历?  Linux系统命令中screen命令详解  EditPlus中的正则表达式实战(6)  如何用wdcp快速搭建高效网站?  Firefox Developer Edition开发者版本入口  微信小程序 input输入框控件详解及实例(多种示例)  javascript基本数据类型及类型检测常用方法小结  详解Android中Activity的四大启动模式实验简述  如何用y主机助手快速搭建网站?  C++时间戳转换成日期时间的步骤和示例代码  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Python文件流缓冲机制_IO性能解析【教程】  bootstrap日历插件datetimepicker使用方法  如何用搬瓦工VPS快速搭建个人网站?  如何破解联通资金短缺导致的基站建设难题?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  音响网站制作视频教程,隆霸音响官方网站?  Laravel如何优化应用性能?(缓存和优化命令)  Internet Explorer官网直接进入 IE浏览器在线体验版网址  香港服务器如何优化才能显著提升网站加载速度?  详解jQuery中的事件  详解Android——蓝牙技术 带你实现终端间数据传输  Python正则表达式进阶教程_复杂匹配与分组替换解析  Android自定义控件实现温度旋转按钮效果  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  如何在企业微信快速生成手机电脑官网?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  jquery插件bootstrapValidator表单验证详解