行为型(六) - 状态模式

news2024/12/25 22:44:33

一、概念

状态模式(State Pattern):类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

使用场景: 一个对象的行为由它的状态决定,而且它必须在运行时根据自身状态改变它的行为。

二、实现

这里控件MediaPlayer状态机转换做例子,状态装换如下图:
mediaplayer.PNG
1、 状态机接口

public interface State {
    String getName();
    void start(StateMachine stateMachine);
    void pause(StateMachine stateMachine);
    void stop(StateMachine stateMachine);
    void prepare(StateMachine stateMachine);
}

2、状态实现类,这里代码只贴了两个状态,其他都类似。

#PausedState 
public class PausedState implements State {
    private static final PausedState instance = new PausedState();
    public static State getInstance() {
        return instance;
    }

    @Override
    public void start(StateMachine stateMachine) {
        System.out.println("进入start前的准备工作");
        stateMachine.setState(StartedState.getInstance());
    }

    @Override
    public void pause(StateMachine stateMachine) {
    }

    @Override
    public void stop(StateMachine stateMachine) {
        System.out.println("进入stop前的准备工作");
        stateMachine.setState(StoppedState.getInstance());
    }

    @Override
    public void prepare(StateMachine stateMachine) {
    }

    @Override
    public String getName() {
        return "paused";
    }
}

#StartedState
public class StartedState implements State {
    private static final StartedState instance = new StartedState();
    public static State getInstance() {
        return instance;
    }

    @Override
    public void start(StateMachine stateMachine) {        
    }

    @Override
    public void pause(StateMachine stateMachine) {
        System.out.println("进入pause前的准备工作");
        stateMachine.setState(PausedState.getInstance());
    }

    @Override
    public void stop(StateMachine stateMachine) {
        System.out.println("进入stop前的准备工作");
        stateMachine.setState(StoppedState.getInstance());
    }

    @Override
    public void prepare(StateMachine stateMachine) {
    }

    @Override
    public String getName() {
        return "started";
    }
}

3、状态机

public class StateMachine {
    private State state = PreparedState.getInstance();

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void start() {
        state.start(this);
    }

    public void pause() {
        state.pause(this);
    }

    public void stop() {
        state.stop(this);
    }

    public void prepare() {
        state.prepare(this);
    }
}

4、测试类

public class Client {
    public static void main(String[] args) {
        StateMachine stateMachine = new StateMachine();
        System.out.println("现在的状态:" + stateMachine.getState().getName());

        stateMachine.start();
        System.out.println("现在的状态:" + stateMachine.getState().getName());

        stateMachine.pause();
        System.out.println("现在的状态:" + stateMachine.getState().getName());
    }
}

5、运行结果
状态模式结果.png

总结:个人理解,使用场景就是包含有多种状态,且状态间可通过一些操作进行转换。正常硬代码实现,就是if-else判断当前状态,切换为下一个状态。为了避免过多状态及操作代码耦合,将各个状态都单独拆出来,在状态类中加入状态流转逻辑,把执行操作抽离到StateMachine中实现解耦。

参考文章:
状态模式(state pattern)

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

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

相关文章

【Java 高阶】一文精通 Spring MVC - 转换器(五)

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

期权是什么?期权的优缺点是什么?

期权是一种合约,有看涨期权和看跌期权两种类型,也就是做多和做空两个方向,走势标的物对应大盘指数,这也是期权与其他金融工具的主要区别之一,可以用于套利,对冲股票和激进下跌的风险,下文介绍期…

HTML总结 2[转]

以下转载和参考自:HTML 表单。 1、表格 可以通过 CSS 设置表格的样式: 如下为将上面table.lamp th,td样式中的padding注释掉,开启table.lamp中的padding的效果: 2、列表 3、表单 表单用于收集用户的输入,如下图所…

咨询师需要具备同理心

做咨询的这么多年,经常会听到这样的一些槽点: “也不知道怎么想的,压根就不是正常的思考逻辑!” “上次就是这样,跌到同一条沟里了吧?” “如此简单的事情,推进起来为什么这么难?…

IDC发布中国低代码市场报告,得帆独立低代码市占率第一

近日,国际数据公司IDC公布了《2022下半年中国低代码与零代码软件市场跟踪报告》(以下简称“报告”)。 2022下半年中国低代码与零代码软件市场规模为15.6亿元人民币,得帆低代码PaaS平台凭借过硬的产品优势和深厚的客户实践经验&am…

RK3399平台开发系列讲解(内核调试篇)网络调试工具

🚀返回专栏总目录 文章目录 一、dstat 工具介绍二、例如dstat 进行网络问题调试三、ss 命令查看 TCP 详细信息四、netstat 查看TCP详细信息沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍网络的相关工具。 一、dstat 工具介绍 当设备产生问题,而我们又…

情人节定制:HTML5 Canvas全屏七夕爱心表白特效

❤️ 前言 “这个世界乱糟糟的而你干干净净可以悬在我心上做太阳和月亮。”,七夕节表白日,你要错过吗?如果你言辞不善,羞于开口的话,可以使用 html5 canvas 制作浪漫的七夕爱心表白动画特效,全屏的爱心和…

使用Netplan建立Linux网络,简便的声明性方法

除了周围网络环境的复杂性之外,由于使用的技术堆栈和工具范围很广,Linux 网络可能会令人困惑。网桥、绑定、VRF 或路由的配置可以通过编程、声明、手动或自动化方式使用 ifupdown、ifupdown2、ifupdown-ng、iproute2、NetworkManager、systemd-networkd …

Python土力学与基础工程计算.PDF-土的三项组成

5.3 Python求解 Python 求解代码如下: 1. # 定义已知参数 2. G_s 2.7 # 比重 3. w 0.2 # 含水量 4. e 0.6 # 孔隙比 5. gamma_w 9.81 # 水的重度 6. 7. # 根据公式计算饱和度 8. S_r G_s * w / e 9. print("饱和度为", S_r) 10. 11.…

UbuntuDDE 23.04发布,体验DeepinV23的一个新选择

UbuntuDDE 23.04发布,体验DeepinV23的一个新选择 昨晚网上搜索了一圈,无意看到邮箱一条新闻,UbuntuDDE 23.04发布了 因为前几天刚用虚拟机安装过,所以麻溜的从网站下载了ISO文件,安装上看看。本来没多想,…

亚信科技AntDB数据库通过GB 18030-2022最高实现级别认证,荣膺首批通过该认证的产品之列

近日,亚信科技AntDB数据库通过GB 18030-2022《信息技术 中文编码字符集》最高实现级别(级别3)检测认证,成为首批通过该认证的数据库产品之一。 图1:AntDB通过GB 18030-2022最高实现级别认证 GB 18030《信息技术 中文编…

得帆信息合伙人——张少伟:使用低代码就像逛宜家,总会有不期而至的小惊喜等着你

随着数字化、智能化、网络化、自动化阶段不断跃升,新技术不断涌现,数字化转型成了大多数企业的发展趋势。在这个背景下,以下问题是被提起次数较多的: 企业要不要买低代码?低代码到底能做什么系统?低代码适合…

Memtester的使用(xilinx zc706)

1.1:测试概述 Memtester主要是针对内存压测的工具,官方的解释:testing the memory subsystem for faults。主要是捕获内存错误和一直处于很高或者很低位的坏位,测试随机值、异或比较、减法、乘法、除法、与或运算等。memtester 是…

情感书单背景素材分享,轻松把书单制作成视频

在互联网时代,我们可以通过各种方式来分享自己的想法和创意。其中,视频是一种非常受欢迎的方式,它可以将图像、声音和文字有机地结合在一起,形成一个丰富多彩的信息载体。如果你想分享自己的情感书单,那么将其制作成视…

【自用】无法通过ESP32创建HomeAssistant实体问题解决(MQTT对ESP32创建实体请求无应答)

一、问题描述 1.使用 MQTTX 测试客户端能够创建实体 当通过 MQTTX 发送注册实体请求的时候,实体能够在 MQTT 服务器中注册成功。 2.使用 ESP32 无法创建实体 在ESP32中通过 publish() 函数发送注册请求的时候,并不会报任何错误,但 MQTT 服…

谷粒商城环境搭建二:开发环境统一

开发环境配置统一 Maven配置 查看maven信息 修改配置文件&#xff1a;apache-maven-3.3.9\conf\settings.xml# 配置阿里云镜像 <mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name&…

行为型(十) - 解释器模式

一、概念 解释器模式&#xff08;Interpreter Pattern&#xff09;&#xff1a;解释器模式为某个语言定义它的语法&#xff08;或者叫文法&#xff09;表示&#xff0c;并定义一个解释器用来处理这个语法。实际应用中较少用到的行为模式。 二、实现 举个常见的面试题&#x…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v7.0版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持 UDP 、TCP 、WebSocket 三种协议&#xff0c;支持 iOS、Android、H5、标准Java、小程序、Uniapp&#xff0c;服务端基于Netty编写。 工程…

WebDAV之π-Disk派盘 + Cloud Player

Cloud Player云媒体播放器是存储在常见云平台中的内容的通用播放器,无需将其下载到设备。支持以下云平台:Google Drive、DropBox、One Drive、WebDav等。此外,在播放或查看文件时,您可以将其下载到本地设备中,以便在未连接到互联网时稍后进行检查。 π-Disk派盘 – 知识管…

Docker容器:docker-compose管理创建LNMP服务并运行Wordpress网站平台

文章目录 一&#xff0e;项目环境1. 环境描述2.项目需求 二&#xff0e;部署过程1.安装Docker2.安装Docker加速器3.Docker-Compose安装部署4.准备依赖文件、配置nginx5.配置mysql6.配置php7.编写docker-compose.yml8.验证 三.容器快照&#xff0c;然后将Docker镜像打包成tar包备…