二、21【设计模式】之状态模式

今天的博客主题

       设计模式 ——》 设计模式之状态模式


状态模式 SP (State Pattern)

 

定义

允许对象在内部状态发生改变时改变它的行为,看起来好像修改了它的类。

类的行为是由状态决定的,不同的状态下该类有不同的行为。就是一个对象在其内部改变的时候,它的行为也随之改变。

核心就是状态与行为的绑定,不同状态对应不同行为。

 

应用场景

在生活中的场景常见的就是订单状态的改变。

1)行为随状态改变而改变的场景。

2)一个操作中有大量分支存在,而这些分支状态又取决于对象的状态。

3)

 

优点

1)结构清晰,将状态独立为类,消除分支判断,提高代码维护性。

2)状态类职责明确具备扩展性。

3)

 

缺点

1)如果一个事物具备多种状态,则状态类太多,类膨胀。

2)状态模式的结构与实现都较为复杂,若使用不当则导致程序结构代码混乱。

3)

 

源码中的应用

该模式的具体应用在源码中非常少见。

 

代码示例

状态模式主要包含以下几个角色

上下文角色(Context):定义客户端需要的接口,维护一个当前状态实例,进行具体状态切换。

抽象状态角色(state):定义该状态下的行为,可以有一个或多个。

具体状态角色(ConcreteState):实现该状态对应的行为,在需要的情况下进行状态的切换。

// 上下文角色
class Context{
    private State state;
    public void setState(State state) {
        this.state = state;
    }
}

// 抽象状态角色
interface State{
    // 抽象业务方法,不同的具体状态类可以不同的实现
    void doSome(Context context);
}

// 具体状态角色
class StartState implements State {
    @Override
    public void doSome(Context context) {
        System.out.println("启动状态");
        context.setState(this);
    }
}
class StopState implements State {
    @Override
    public void doSome(Context context) {
        System.out.println("停止状态");
        context.setState(this);
    }
}

// 客户端调用
public class StatePattern {
    public static void main(String[] args) {
        Context context = new Context();

        StartState start = new StartState();
        start.doSome(context);

        StopState stop = new StopState();
        stop.doSome(context);
    }
}

将一个对象在不同状态下的不同行为封装在一个个状态类中。

 

状态机实现状态变动

状态机试状态模式的一种应用,相当于是上下文角色的一个升级版。在工作流和游戏中有大量的使用。spring 也提供了一个很好的解决方案 StateMechine(状态机),帮助我们简化开发过程,让其结构更加层次化。

需要引入jar,就不细说了,自行研究下

 

<dependency>
    <groupId>org.springframework.statemachine</groupId>
    <artifactId>spring-statemachine-core</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

 

 

热门文章

暂无图片
编程学习 ·

通过连接Mysql实现的简单的登录注册功能

注册,登录 以下为具体代码: public class JDBCUtils {private static String url;private static String user;private static String password;private static String driver;//读取文件,只需读取一次即可拿到这些值,使用静态代码块static {try {//创建Properties集合类Pr…
暂无图片
编程学习 ·

CnPlugin是PL/SQL Developer工具插件使用

CnPlugin是PL/SQL Developer工具插件,支持PL/SQL Developer 7.0以上版本。1、安装2、拷贝文件安装结束后,得到一个 CnPlugin.dll 和 “CnPlugin”的文件夹,把这两个拷贝到 PL/SQL Developer的安装路径下的 “PlugIns”目录下,重启PL/SQL Develop可以使用了,打开的时候 会在…
暂无图片
编程学习 ·

Vue

常用指令文本插值 v-html:把文本解析为 HTML 代码。 绑定属性 v-bind:为 HTML 标签绑定属性值。 条件渲染v-if:条件性的渲染某元素,判定为真时渲染,否则不渲染。 v-else:条件性的渲染。 v-else-if:条件性的渲染。 v-show:根据条件展示某元素,区别在于切换的是 display …
暂无图片
编程学习 ·

JDBC

JDBC(Java DataBase Connectivity) JDBC 简介 Java 数据库连接技术。即用 Java 程序操作数据库的一套接口。是独立与 特定数据库(MySQL、SQLServer) 的管理系统,也就是无论使用的是什么类型的数据库都可以用 JDBC 去连接。 让 JDBC 去翻译底层数据库的各种指令,我们只需要使…
暂无图片
编程学习 ·

NC6 基于元数据的持久化服务接口实现类

基于元数据的持久化服务接口实现类: package nc.md.persist.framework.imp;import java.util.Collection;import nc.md.data.access.NCObject; import nc.md.data.criterion.QueryCondition; import nc.md.model.MetaDataException; import nc.md.persist.framework.IMDPersis…
暂无图片
中恒嘉业 ·

关于主从复制的超详细解析(全)

目录前言1. 主从复制1.1 方式2. Mysql的主从复制2.1 一主一从2.1.1 window和linux通讯2.1.2 linux和linux的通讯2.2 双主双从3. Redis的主从复制3.1 哨兵模式3.2 java代码结合前言 主要介绍mysql的主从复制以及redis的主从复制 能由浅入深的明白原理以及如何操作 再者&#xf…
暂无图片
郑州普通话 ·

android面试简历模板,2020-2021阿里巴巴Android面试真题解析

面试总结 面试大厂一定要做好充分的准备,没有准备就去面试完全是去当炮灰的,更是对自己的不负责。再就是基础真的很重要,基础,基础,基础,重要的事说3遍。 下面给大家分享下我在面试美团之前复习整理的一些面试题及解析,主要是字节跳动、阿里、腾讯、美团、拼多多等大厂常…
暂无图片
郑州普通话 ·

Android面试心得必备技能储备详解,直接上干货

组件化 1.1 组件化初衷APP版本不断的迭代,新功能的不断增加,业务也会变的越来越复杂,维护成本高。 业务耦合度高,代码越来越臃肿,团队内部多人协作开发困难。 Android项目在编译代码的时候电脑会非常卡,又因为单一工程下代码耦合严重,每修改一处代码后都要重新编译打包测…
暂无图片
代理记账 ·

在web应用中发送和接收Jakarta消息

Running the websimplemessage Example To Package and Deploy websimplemessage Using Maven _1、Make sure that GlassFish Server has been started (see Starting and Stopping GlassFish Server). _2、In a terminal window, go to: tut-install/examples/jms/websimp…
暂无图片
cgfy ·

C++学习日记2——函数、封装、对象特性

一、函数 1.1 函数默认参数 1.1.1 简介 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 1.1.2 语法 返回值类型 函数名 (参数 默认值) {} 1.1.3 代码 #include <iostream> using namespace std;// 函数的默认参数 int func(int a, int b 20, int c 30…
暂无图片
coreui ·

视频水印怎么去除?超简单 千万不要错过

小编在知乎看到很多大佬分享的视频去水印的方法&#xff0c;但是感觉都有点太复杂了&#xff0c;今天就来分享一下小编自己私藏的几个针对于视频去水印的软件和网站~建议大家收藏哦~ 1、爱给网-视频去水印小工具&#xff08;免费 在线&#xff09; 推荐点 1、在线操作&#…
暂无图片
coreui ·

Mac 安装 tomcat10

Mac 安装 tomcat10 1、下载tomcat tomcat官网&#xff1a;https://tomcat.apache.org/ 点击我下载的tomcat10&#xff1a; 2、下载解压,给bin下的*.sh文件添加可执行权限 3、修改webapps下的ROOT中的index文件查看效果
暂无图片
未来博客 ·

视频水印怎么去除?超简单 千万不要错过

小编在知乎看到很多大佬分享的视频去水印的方法&#xff0c;但是感觉都有点太复杂了&#xff0c;今天就来分享一下小编自己私藏的几个针对于视频去水印的软件和网站~建议大家收藏哦~ 1、爱给网-视频去水印小工具&#xff08;免费 在线&#xff09; 推荐点 1、在线操作&#…
暂无图片
未来博客 ·

Mac 安装 tomcat10

Mac 安装 tomcat10 1、下载tomcat tomcat官网&#xff1a;https://tomcat.apache.org/ 点击我下载的tomcat10&#xff1a; 2、下载解压,给bin下的*.sh文件添加可执行权限 3、修改webapps下的ROOT中的index文件查看效果
暂无图片
建站日记 ·

惠州实验室建设选址、勘察事项

惠州实验室建设选址、勘察事项&#xff0c;SICOLAB技术员带您从实验室建设启动前思考问题考虑如下&#xff1a;一、不同实验室建设选址要求 1.化学实验室 &#xff08;1&#xff09;清洁安静环境 &#xff08;2&#xff09;远离住宅、生活区 &#xff08;3&#xff09;锅炉房与…
暂无图片
建站日记 ·

NLP聊天机器人原理(seq2seq模型)

一、seq2seq模型 1.概念 seq2seq是一个Encoder-Decoder结构的网络&#xff0c;它的输入是一个序列&#xff0c;输出也是一个序列。Encoder中将一个可变长度的信号序列变为固定长度的向量表达&#xff0c;Decoder将这个固定长度的向量变成可变长度的目标的信号序列。这个结构最…
暂无图片
mfbz ·

惠州实验室建设选址、勘察事项

惠州实验室建设选址、勘察事项&#xff0c;SICOLAB技术员带您从实验室建设启动前思考问题考虑如下&#xff1a;一、不同实验室建设选址要求 1.化学实验室 &#xff08;1&#xff09;清洁安静环境 &#xff08;2&#xff09;远离住宅、生活区 &#xff08;3&#xff09;锅炉房与…
暂无图片
mfbz ·

全渠道会员通-天猫会员通3: 会员运营内容准备

在天猫会员通技术对接开发过程中&#xff0c;为了通知存量会员的通知工作&#xff0c;发挥会员通的优势&#xff0c;品牌需要做好以下事宜&#xff1a; 会员体系暂停公告&#xff1a;因会员通技术升级期间&#xff0c;会员服务将被暂停&#xff0c;店铺tab中会员入口将被下线&…
暂无图片
珊珊日记 ·

C# 执行Javascript脚本

c#教程https://www.xin3721.com/eschool/CSharpxin3721/ 前一阵子使用C#编写SCXML状态机&#xff0c;需要解析EMCScript表达式&#xff0c;使用了Jint库&#xff08;https://github.com/sebastienros/jint/)&#xff0c;当时感觉与C#之间的数据转换不是很方便。这两天有时间又关…
暂无图片
珊珊日记 ·

第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛

A.大学期末现状 题目描述 作为一名大学生的你&#xff0c;现在又到了期末查成绩的时候&#xff0c;当你的成绩大于等于60时请输出“jige,haoye!”,否则输出"laoshi,caicai,laolao"。 输入描述: 一行&#xff0c;一个整数x代表你的成绩&#xff08;0<x<100&a…