设计模式_访问者模式

访问者模式

介绍

设计模式定义案例问题堆积在哪里
访问模式访问模式是行为型设计模式
从对象中分类出算法
这些算法封装为对象, 这样这些算法类很容易扩展,添加新的算法类就可以了
不同的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等级 ,发送不同的礼物

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专访HuggingFace CTO:开源崛起、创业故事和AI民主化丨智源独家

导读 HuggingFace CTO Julien Chaumond认为,在大模型时代,AI民主化至关重要。随着大语言模型和复杂人工智能系统的崛起,持续提升AI技术的可及性有助于确保这些技术的获取和控制不集中在少数强大实体手中。技术民主化促进了机会均等&#xff0…

下载安装PyCharm的步骤

1、首先进入Pycharm官网,并进行下载,日常使用社区版也是OK的 官网:https://www.jetbrains.com/pycharm/download/?sectionwindows 2、可以自定义路径进行安装,注意路径要全英哈 3、大家可以根据自己的需要来进行勾选 4、安装完成…

(免费领源码)小程序+spring boot+masql校园志愿者管理系统99213-计算机毕业设计项目选题推荐

摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,校园志愿者管理系统被用户普遍使用,为方便用户…

多态 虚函数表深度剖析 纯干货讲解(2)

💯 博客内容:多态 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准C后端工程师,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是CSD…

两种MySQL OCP认证应该如何选?

很多同学都找姚远老师说要参加MySQL OCP认证培训,但绝大部分同学并不知道MySQL OCP认证有两种,以MySQL 8.0为例。 一种是管理方向,叫:Oracle Certified Professional, MySQL 8.0 Database Administrator(我考试的比较…

Mac安装VMware

去官网下载一下VMware Download VMware Fusion | VMware | SG 下载完成之后,打开直接闪退,参考这篇文章解决 解决macOS13安装Fusion13闪退的问题-CSDN博客 然后即可成功顺行

「视频编码软件」Media Encoder(Me) 2024 Mac/win中文版下载安装

Adobe Media Encoder(Me) 2024是一款专业的视频编码工具,它可以将各种视频格式进行转换、压缩和编码,以满足不同媒体平台和设备的需求。 以下是 Media Encoder 2023 的主要功能和新增功能: 视频编码和转换:支持将各种视频格式进…

idea文件比对

idea文件比对 1.项目内的文件比对2.项目间的文件比对3. 剪切板对比4. 版本历史(不同分支和不同commit)对比 1.项目内的文件比对 在项目中选择好需要比对的文件(类),然后选择Compare Files Mac下的快捷键是Commandd, 这样的比对像是git冲突解决一样 …

Leetcode41缺失的第一个正数

思路:原地哈希表 长度为N的数组,没有出现过的正整数一定是1~N1中的一个。 此时会思考能不能用一个哈希表来保存出现过的1~N1的数,然后从 1 开始依次枚举正整数,并判断其是否在哈希表中 但是题目要求常数级别的空间,就不…

OpenGL_Learn06(纹理)

接着之前的OpenGL_Learn05(纹理)-CSDN博客 1. 修改片段着色器 修改片段着色器,仅让笑脸图案朝另一个方向看 >>>>> 纹理坐标的Y轴没有进行改变,需要改变的是X轴的纹理坐标 片段代码改写如下 #version 330 core out…

SpringCloud 微服务全栈体系(十一)

第十章 RabbitMQ 三、SpringAMQP SpringAMQP 是基于 RabbitMQ 封装的一套模板,并且还利用 SpringBoot 对其实现了自动装配,使用起来非常方便。 SpringAmqp 的官方地址:https://spring.io/projects/spring-amqp SpringAMQP 提供了三个功能&…

九、W5100S/W5500+RP2040树莓派Pico<SNTP 获取网络时间>

文章目录 1 前言2 协议简介2.1 什么是SNTP2.2 SNTP的优点2.3 SNTP原理2.4 应用场景 3 WIZnet以太网芯片4 SNTP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 随着科技的不断进步和应用需求的不断变…

el-cascader级联选择器选中一个全选中问题

问题 只选中一个却把同级全选中 解决 :props中添加label、value、children属性 label、value、children属性值需要和后端返回的集合中的字段名保持一致 后端返回数据:

AI:55-基于深度学习的人流量检测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

redis源码分析之IO多路复用

文章目录 1、简述2、多路复用的三个函数3、创建epoll实例4、绑定端口、监听端口5、向epoll实例注册连接事件6、从epoll实例中获取就绪的事件 1、简述 众所周知,redis是一款抗高并发的利器,据官方压测,单机可达10万qps。但背后实际处理命令的…

07、vue : 无法加载文件 C:\Users\JH\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。

目录 问题解决: 问题 vue : 无法加载文件 C:\Users\JH\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。 在使用 VSCode 时,创建 Vue 项目报的错 创建不了 Vue 项目 解决: 因为在此系统上禁止运行该脚本&#xff0…

什么是DITA?从百度的回答说起

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 什么是DITA? 把这个问题输入百度,获得以下回答: DITA 是“Darwin Information Typing Architecture”(达尔文信息类型化体系结构)的缩写,它是IBM 公司为OASIS 所支持…

交叉编译程序:以 freetype 为例

1 程序运行的一些基础知识 1.1 编译程序时去哪找头文件? 系统目录:就是交叉编译工具链里的某个 include 目录;也可以自己指定:编译时用 “ -I dir ” 选项指定。 1.2 链接时去哪找库文件? 系统目录&#…

面试算法48:序列化和反序列化二叉树

题目 请设计一个算法将二叉树序列化成一个字符串,并能将该字符串反序列化出原来二叉树的算法。 分析 先考虑如何将二叉树序列化为一个字符串。需要逐个遍历二叉树的每个节点,每遍历到一个节点就将节点的值序列化到字符串中。以前序遍历的顺序遍历二叉…

latex设置图片的位置

Latex提供了一些命令来控制图片的位置。我们可以通过使用\begin{figure}[位置选项]来控制图片的位置。位置选项可以有h、t、b、p、!这五个,分别表示以下含义: h:表示放在当前位置,不过有时由于论文的格式限制,可能放不下。 t:表示…