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表单验证详解

