设计模式_状态模式

news2024/11/15 21:57:24

状态模式

介绍

设计模式定义案例问题堆积在哪里解决办法
状态模式一个对象 状态可以发生改变
不同的状态又有不同的行为逻辑
游戏角色 加载不同的技能
每个技能有不同的:攻击逻辑 攻击范围 动作等等
1 状态很多
2 每个状态有自己的属性和逻辑
每种状态单独写一个类
角色需要那个状态就加载哪一个

类图

角色: 

stateBase 抽象状态

stateA 具体状态A

stateB 具体状态B

stateC 具体状态C

FactoryState  状态工厂

代码

RoleContext

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RoleContext
{
    string name;
    StateBase currentState = null;

    public RoleContext()
    {
        name = "独孤求败";
    }

    // 展示动作
    public void ShowAction()
    {
        if (null != currentState)
        {
            currentState.Action();
        }
    }

    // 切换状态
    public void ChangeActionState(StateBase newState)
    {
        currentState = newState;
    }
}

StateBase


public abstract class StateBase
{
    public abstract void Action();
}

StateA 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StateA : StateBase
{
    string name = "普攻";

    public override void Action()
    {
        Debug.Log("释放-" + name);
    }
}

StateB 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StateB : StateBase
{
    string name = "次元斩";

    public override void Action()
    {
        Debug.Log("释放-" + name);
    }
}

StateC

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StateC:StateBase
{
    string name = "升龙击";

    public override void Action()
    {
        Debug.Log("释放-" + name);
    }
}

FactoryState

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FactoryState
{
    // 单例
    static FactoryState  self = null;
    FactoryState() { }
    public static  FactoryState Instance()
    {
        if (null == self)
            self = new FactoryState();
        return self;
    }


    Dictionary<string, StateBase> dic = new Dictionary<string, StateBase>();

    // 获取实例
    public StateBase GetStateIns(string className)
    {
        StateBase ins = null;

        switch (className)
        {
            case "StateA":
                {
                    if (false == dic.ContainsKey(className))
                        ins = new StateA();
                    else
                        ins = dic[className];
                }
                break;

            case "StateB":
                {
                    if (false == dic.ContainsKey(className))
                        ins = new StateB();
                    else
                        ins = dic[className];
                }
                break;

            case "StateC":
                {
                    if (false == dic.ContainsKey(className))
                        ins = new StateC();
                    else
                        ins = dic[className];
                }
                break;

            default:
                Debug.Log("未发现该类!");
                break;
        }

        return ins;
    }
}

测试代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestZT : MonoBehaviour
{
    void Start()
    {
        RoleContext role = new RoleContext();

        // 切换技能A
        role.ChangeActionState(FactoryState.Instance().GetStateIns("StateA"));
        role.ShowAction();

        // 切换技能B
        role.ChangeActionState(FactoryState.Instance().GetStateIns("StateB"));
        role.ShowAction();

        // 切换技能C
        role.ChangeActionState(FactoryState.Instance().GetStateIns("StateC"));
        role.ShowAction();

    }

}

结果

总结

状态模式

1 是一个非常好用的 解耦合的手段, 角色不同的状态封装不同的(动作,属性,限制)

2 非常符合对修改封闭对扩展开发的原则。

3 让状态的职责更加的单一

4 也符合了依赖倒置 ,依赖了抽象

5 符合了迪米特原则,角色对状态类内部的具体实现不知道

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

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

相关文章

一个注解,实现数据脱敏-plus版

shigen坚持日更的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考&#xff0c;不断沉淀和成长。 当看到这个文章名的时候&#xff0c;是不是很熟悉&#xff0c;是的shigen之前发表了一个这…

[C++]命名空间等——喵喵要吃C嘎嘎

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

CSRF 篇

一、CSRF 漏洞&#xff1a; 1、漏洞概述&#xff1a; &#xff08;1&#xff09;一般情景&#xff1a; 利用已认证用户的身份执行未经用户授权的操作。攻击者试图欺骗用户在其不知情的情况下执行某些操作&#xff0c;通常是在受害者已经登录到特定网站的情况下。 &#xff0…

《动手深度学习》线性回归简洁实现实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

百度富文本上传图片后样式崩塌

&#x1f525;博客主页&#xff1a; 破浪前进 &#x1f516;系列专栏&#xff1a; Vue、React、PHP ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 问题描述&#xff1a;上传图片后&#xff0c;图片会变得很大&#xff0c;当点击的时候更是会顶开整个的容器的高跟宽 原因&#…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割7(数据预处理)

在上一节&#xff1a;【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6&#xff08;数据预处理&#xff09; 中&#xff0c;我们已经得到了与mhd图像同seriesUID名称的mask nrrd数据文件了&#xff0c;可以说是一一对应了。 并且&#xff0c;mask的文件&#xff0c;还根据结…

【错误解决方案】ModuleNotFoundError: No module named ‘ngboost‘

1. 错误提示 在python程序&#xff0c;尝试导入一个名为ngboost的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named ‘ngboost‘ 2. 解决方案 出现上述问题&#xff0c;可能是因为你还没有安装这个模块&#xff0c;…

CXL技术交流群问题讨论记录(1)

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c;转载或引用请注明出处【https://mangopapa.blog.csdn.net/article/details/134131924】。…

Python 学习1 基础

文章目录 基础字符串字面量常用的值类型注释变量print语句数据类型数据类型转换标识符运算符 字符串拓展小结 2023.10.28 周六 最近打算学一下Python&#xff0c;毕竟确实简单方便&#xff0c;而且那个编程语言排名还是在第一。不过不打算靠它吃饭&#xff0c;深不深入暂且不说…

防数据泄密的解决方案

防数据泄密的解决方案 安企神数据防泄密系统下载使用 现代化企业离不开信息数据&#xff0c;数据对企业的经营至关重要&#xff0c;也是企业发展的命脉。为了保护公司数据不被泄露&#xff0c;尤其是在防止数据泄密方面&#xff0c;公司面临着巨大的挑战&#xff0c;需要采取…

Python爬虫实战(六)——使用代理IP批量下载高清小姐姐图片(附上完整源码)

文章目录 一、爬取目标二、实现效果三、准备工作四、代理IP4.1 代理IP是什么&#xff1f;4.2 代理IP的好处&#xff1f;4.3 获取代理IP4.4 Python获取代理IP 五、代理实战5.1 导入模块5.2 设置翻页5.3 获取图片链接5.4 下载图片5.5 调用主函数5.6 完整源码5.7 免费代理不够用怎…

EasyFlash移植使用- 关于单片机 BootLoader和APP均使用的情况

目前&#xff0c;我的STM32单片机&#xff0c;需要在BootLoader和APP均移植使用EasyFlash&#xff0c;用于参数管理和IAP升级使用。 但是由于Flash和RAM限制&#xff0c;减少Flash占用&#xff0c;我规划如下&#xff1a; BootLoader中移植EasyFlash使用旧版本&#xff0c;因为…

机器学习-基本知识

 任务类型 ◼ 有监督学习(Supervised Learning) 每个训练样本x有人为标注的目标t&#xff0c;学习的目标是发现x到t的映射&#xff0c;如分类、回归。 ◼ 无监督学习(Unsupervised Learning) 学习样本没有人为标注&#xff0c;学习的目的是发现数据x本身的分布规律&#xf…

ROS自学笔记二十: Gazebo里面仿真环境搭建

Gazebo 中创建仿真实现方式有两种:1直接添加内置组件创建仿真环境2: 手动绘制仿真环境 1.添加内置组件创建仿真环境 1.1启动 Gazebo 并添加组件 1.2保存仿真环境 添加完毕后&#xff0c;选择 file ---> Save World as 选择保存路径(功能包下: worlds 目录)&#xff0c;文…

二维数组如何更快地遍历

二维数组如何更快地遍历 有时候&#xff0c;我们会发现&#xff0c;自己的代码和别人的代码几乎一模一样&#xff0c;但运行时间差了很多&#xff0c;别人是 AC \text{AC} AC&#xff0c;你是 TLE \text{TLE} TLE&#xff0c;这是为什么呢&#xff1f; 一个可能的原因是数组的…

延迟队列实现方案总结

日常开发中&#xff0c;可能会遇到一些延迟处理的消息任务&#xff0c;例如以下场景 ①订单支付超时未支付 ②考试时间结束试卷自动提交 ③身份证或其他验证信息超时未提交等场景。 ④用户申请退款&#xff0c;一天内没有响应默认自动退款等等。 如何处理这类任务&#xff0c;最…

http1,https,http2,http3总结

1.HTTP 当我们浏览网页时&#xff0c;地址栏中使用最多的多是https://开头的url&#xff0c;它与我们所学的http协议有什么区别&#xff1f; http协议又叫超文本传输协议&#xff0c;它是应用层中使用最多的协议&#xff0c; http与我们常说的socket有什么区别吗&#xff1f; …

2000-2021年上市公司产融结合度量数据

2000-2021年上市公司产融结合度量数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;股票代码、年份、是否持有银行股份、持有银行股份比例、是否持有其他金融机构股份、产融结合 3、来源&#xff1a;上市公司年报 4、范围&#xff1a;上市公司 5、样本量&#xff…

4种类型WMS的简要说明

仓库管理系统&#xff08;WMS&#xff09;主要有四种类型&#xff1a;独立仓库管理系统、供应链管理系统中的仓库管理模块、ERP 系统中的仓库管理模块和基于云的仓库管理系统。 独立仓库管理系统 独立仓库管理系统提供的功能可实现日常仓库运营。公司可以使用WMS系统来监管和…

【MATLAB源码-第62期】基于matlab的DCSK(差分混沌移位键控调制)系统误码率仿真。

MATLAB 2022a 1、算法描述 DCSK&#xff08;Differential Chaos Shift Keying&#xff09;是一种差分混沌移位键控调制方式&#xff0c;常用于无线通信系统。其调制和解调的基本流程如下&#xff1a; 1. DCSK调制 1.1 生成混沌序列 - 初始条件&#xff1a;选择一个混沌映射&a…