设计模式_访问者模式

访问者模式

介绍

设计模式定义案例问题堆积在哪里
访问模式访问模式是行为型设计模式
从对象中分类出算法
这些算法封装为对象, 这样这些算法类很容易扩展,添加新的算法类就可以了
不同的VIP用户
在不同的节日
领取不同的礼物
if else太多
解决办法小技巧
枚举出不同的用户类(有一个相同的基类)
枚举出不同的节日类(有一个相同的基类)

节日访问者 被 不同VIP等级用户访问
根据不同的用户给出不同的礼物

 
if else。。。转为重载函数方式
函数重载(类型1)
函数重载(类型2)
...
传入不同的数据类型,触发不同的重置函数

类图

代码

PlayerVipBase


public abstract class PlayerVipBase
{public string name;
}

PlayerVipSun 


public class PlayerVipSun : PlayerVipBase
{public PlayerVipSun(){name = "VipSun";   }
}

PlayerVipMoon 


public class PlayerVipMoon : PlayerVipBase
{public PlayerVipMoon(){name = "VipMoon "; }
}

PlayerVipStar 


public class PlayerVipStar : PlayerVipBase
{public PlayerVipStar(){name = "VipStar";}
}

FestivalBase 


interface FestivalBase 
{string GetGift(PlayerVipStar player);string GetGift(PlayerVipMoon player);string GetGift(PlayerVipSun player);
}

Festival_YuanXiaoJie 


public class Festival_YuanXiaoJie : FestivalBase
{public string GetGift(PlayerVipStar player){return player.name + "领取了元宵节礼物:" + "66个复活币";}public string GetGift(PlayerVipMoon player){return player.name + "领取了元宵节礼物:" + "可爱汤圆时装";}public string GetGift(PlayerVipSun player){return player.name + "领取了元宵节礼物:" + "SSR汤圆宝宝";}
}

Festival_GuoQingJie 


public class Festival_GuoQingJie : FestivalBase
{public string GetGift(PlayerVipStar player){return player.name + "领取了国庆节礼物:" + "100R";}public string GetGift(PlayerVipMoon player){return player.name + "领取了国庆节礼物:" + "2023国庆时装";}public string GetGift(PlayerVipSun player){return player.name + "领取了国庆节礼物:" + "SSR龙神";}
}

Festival_61 


public class Festival_61 : FestivalBase
{public string GetGift(PlayerVipStar player){return player.name + "领取了儿童节礼物:" + "100QB";}public string GetGift(PlayerVipMoon player){return player.name + "领取了儿童节礼物:" + "61时装";}public string GetGift(PlayerVipSun player){return player.name + "领取了儿童节礼物:" + "SSR凤凰宝宝";}
}

测试代码

using UnityEngine;public class TestFWZ : MonoBehaviour
{void Start(){// 不同Vip 等级的玩家PlayerVipStar player1  = new PlayerVipStar();PlayerVipMoon player2 = new PlayerVipMoon();PlayerVipSun player3 = new PlayerVipSun();// 六一儿童节Festival_61 liuYi = new Festival_61();// 国庆节Festival_GuoQingJie GuoQingJie = new Festival_GuoQingJie();// 元宵节Festival_YuanXiaoJie YuanXiaoJie = new Festival_YuanXiaoJie();// 领取奖励:61儿童节Debug.Log(liuYi.GetGift(player1));Debug.Log(liuYi.GetGift(player2));Debug.Log(liuYi.GetGift(player3));Debug.Log("------------------------");// 领取奖励:国庆Debug.Log(GuoQingJie.GetGift(player1));Debug.Log(GuoQingJie.GetGift(player2));Debug.Log(GuoQingJie.GetGift(player3));Debug.Log("------------------------");// 领取奖励:国庆Debug.Log(YuanXiaoJie.GetGift(player1));Debug.Log(YuanXiaoJie.GetGift(player2));Debug.Log(YuanXiaoJie.GetGift(player3));}
}

结果

总结

访问者模式是拆分出了领奖行为 ,后封装为对象,这个对象管理了礼物。

礼物管理员进一步拆分为 多个不同节日的礼物管理员

管理员可以自动识别玩家VIP等级 ,发送不同的礼物

这里小技巧“重载-获取礼物函数(不同的玩家类型)”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[自定义 Vue 组件] 小尾巴顶部导航栏(2.0) TailTopNav

文章归档:https://www.yuque.com/u27599042/coding_star/oglrqteg8fzvvzn0 [自定义 Vue 组件] 响应式顶部导航栏(1.0) TopNav:https://www.yuque.com/u27599042/coding_star/hzltsltxgavwx8u2 组件效果示例 组件所依赖的子组件 [自定义 Vue 组件] 小尾巴…

STM32F103C8T6第一天:认识STM32 标准库与HAL库 GPIO口 推挽输出与开漏输出

1. 课程概述(297.1) 课程要求:C语言熟练,提前学完 C51 2. 开发软件Keil5的安装(298.2) 开发环境的安装 编程语言:C语言需要安装的软件有两个:Keil5 和 STM32CubeMX Keil5 的安装…

android display 杂谈(三)WMS

用来记录学习wms,后续会一点一点更新。。。。。。 代码:android14 WMS是在SystemServer进程中启动的 在SystemServer中的main方法中,调用run方法。 private void run() { // Initialize native services.初始化服务,加载andro…

[SSD综述 1.4] SSD固态硬盘的架构和功能导论

依公知及经验整理,原创保护,禁止转载。 专栏 《SSD入门到精通系列》 <<<< 返回总目录 <<<< ​ 前言 机械硬盘的存储系统由于内部结构, 其IO访问性能无法进一步提高,CPU与存储器之间的性能差距逐渐扩大。以Nand Flash为存储介质的固态硬盘技术的发展,…

什么是缓冲区溢出?

缓冲区溢出 1. 什么是缓冲区溢出2. 缓冲区溢出攻击的类型3. 攻击者如何利用缓冲区溢出4. 如何防止缓冲区溢出攻击 1. 什么是缓冲区溢出 &#xff08;1&#xff09;缓冲区 缓冲区是一块连续的计算机内存区域&#xff0c;用于在将数据从一个位置移到另一位置时临时存储数据。这…

2023-2024 中国科学引文数据库来源期刊列表(CSCD)

文章目录 CSCD来源期刊遴选报告2023-2024 中国科学引文数据库来源期刊列表&#xff08;CSCD&#xff09; CSCD来源期刊遴选报告 2023-2024 中国科学引文数据库来源期刊列表&#xff08;CSCD&#xff09;

数据结构与算法(Java版) | 排序算法的介绍与分类

各位朋友&#xff0c;现在我们即将要进入数据结构与算法&#xff08;Java版&#xff09;这一系列教程中的排序算法这一章节内容的学习中了&#xff0c;所以还请大家系好安全带&#xff0c;跟随我准备出发吧&#xff01; 相信诸位应该都知道排序算法有很多种吧&#xff01;就算没…

电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备?

电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备? 电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备? 这里以win10系统为例进行说明: 如下图所示,打开右下角的“网络和Internet设置”, 如下图所示,点击进入“更改适配器选项”, 如下图所示…

Leetcode—110.平衡二叉树【简单】

2023每日刷题&#xff08;十九&#xff09; Leetcode—110.平衡二叉树 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int preFunc(struct TreeNode* root) {if(root…

leetcode-887-鸡蛋掉落(包含最大值最小化,最小值最大化的二分优化+滚动数组的原理)

这里写目录标题 题意解题KNN复杂度DP解法思想&#xff08;超时&#xff09;上述方法的优化 &#xff08;最大值最小化二分优化&#xff09;完整代码 逆向思维的DP&#xff08;ksqrt(n)复杂度&#xff09;代码空间优化&#xff08;滚动数组&#xff09;代码 题意 链接&#xff…

全球首例无液氦脑磁图辅助下的胶质瘤切除手术顺利完成

近日&#xff0c;在国家重点研发计划“新型无液氦脑磁图系统研发”项目支持下&#xff0c;首都医科大学附属北京天坛医院季楠教授团队完成全球首例无液氦脑磁图运动功能区定位辅助下的胶质瘤切除手术。 手术对一例肿瘤累及运动功能区的年轻女性在术前分别利用无液氦脑磁图仪和功…

14 _ 排序优化:如何实现一个通用的、高性能的排序函数?

几乎所有的编程语言都会提供排序函数,比如C语言中qsort(),C++ STL中的sort()、stable_sort(),还有Java语言中的Collections.sort()。在平时的开发中,我们也都是直接使用这些现成的函数来实现业务逻辑中的排序功能。那你知道这些排序函数是如何实现的吗?底层都利用了哪种排…

如何在苹果Mac系统设置中查看Wi-Fi密码?

在 Mac 上查找保存的 Wi-Fi 密码的最简单方法之一是从系统设置内的高级 Wi-Fi 首选项页面。您可以通过下面的方式访问此页面来查找您保存的 Wi-Fi 密码。 1.在 Mac 上&#xff0c;选取「苹果菜单」选择「系统设置」。 2.从侧边栏中选择「Wi-Fi」&#xff0c;单击「高级」。 3.…

【监控指标】监控系统-prometheus、grafana。容器化部署。go语言 gin框架、gRPC框架的集成

文章目录 一、监控有哪些指标二、prometheus、grafana架构Prometheus 组件Grafana 组件架构优点 三、安装prometheus和node-exporter1. docker pull镜像2. 启动node-exporter3. 启动prometheus 四、promql基本语法五、grafana的安装和使用1. 新建空文件夹grafana-storage&#…

【面试专题】设计模式篇①

1.工厂设计模式 工厂设计模式是一种创建型模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但具体创建的对象类型可以在运行时决定。工厂设计模式主要解决的是创建对象的灵活性问题。 工厂设计模式主要包括简单工厂模式、工厂方法模式和抽象工厂模式三种。 简单工厂…

如何使用 SwiftUI 中新地图框架 MapKit

文章目录 前言MapKit 弃用项MapContentBuilder&#xff08;iOS 17&#xff09;地图交互地图样式地图控件地图相机位置总结 前言 了解 iOS 17 中的 MapKit 后&#xff0c;我们会发现 Apple 引入了更适合 SwiftUI 的 API。 MapKit 弃用项 一旦将你的 App 目标更新到 iOS 17&am…

宠物医院服务预约小程序的效果如何

随着养宠家庭增多及对爱宠的照顾加深&#xff0c;除了食品、服饰外&#xff0c;宠物医院近些年也迎来了较高发展&#xff0c;部分城市甚至聚集着众多品牌&#xff0c;以单店或多店品牌的方式拓展市场。 对宠物医院来说&#xff0c;一般都是拓展同市客户&#xff0c;或者多门店…

OpenFeign 的超时重试机制以及底层实现原理

目录 1. 什么是 OpenFeign&#xff1f; 2. OpenFeign 的功能升级 3. OpenFeign 内置的超时重试机制 3.1 配置超时重试 3.2 覆盖 Retryer 对象 4. 自定义超时重试机制 4.1 为什么需要自定义超时重试机制 4.2 如何自定义超时重试机制 5. OpenFeign 超时重试的底层原理 5…

【蓝桥杯】2023省赛H题

考察知识点&#xff1a;双向链表&#xff0c;小根堆 完整代码在文章末尾 题目 【问题描述】 给定一个长度为 N 的整数数列: A1,A2,...,AN。你要重复以下操作 K 次 :…

下载安装各种版本的Vscode以及解决VScode官网下载慢的问题

下载指定版本 在Vscode官网 Vscode官网更新子页 这里的左侧栏点击其中一个会跳转到某个版本&#xff0c;或者在官网子页 https://code.visualstudio.com/updates的后面跟上需要的版本号即可完成目标版本下载页面的跳转 选择Linux里的ARM包不会自动下载而是跳转到另一个页面 …