设计模式之状态模式

news2025/1/22 18:58:27

State design pattern

状态模式的概念、状态模式的结构、状态模式的优缺点、状态模式的使用场景、状态模式的实现示例、状态模式的源码分析


1、状态模式的概念

  对有状态的对象,把复杂的判断逻辑提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

2、状态模式的结构

  • 抽象状态:定义状态的行为。
  • 具体状态:继承自抽象状态,实现当前状态的具体行为。
  • 上下文:持有一个当前状态的引用,对外提供修改状态的行为,并将修改状态的实现委托给引用的当前对象。

state-class

3、状态模式的优缺点

  • 优点:
    • 满足单一职责原则,即把每个状态对应的行为封装到了具体的状态类中。
    • 允许状态转换逻辑与状态对象合成一体,减少了对象之间的相互依赖。
  • 缺点:
    • 状态模式的使用必然会增加系统类和对象的个数。
    • 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
    • 状态模式对开闭原则的支持并不友好。

4、状态模式的使用场景

  • 当一个对象的行为取决于它的状态,并且允许它在运行时根据状态改变它的行为时。
  • 一个操作中含有庞大的分支结构,并且这些分支结构取决于对象的状态时。

5、状态模式的实现示例

抽象状态:

public abstract class State {

    protected Context context;

    public void setContext(Context context) {
        this.context = context;
    }

    public abstract void open();

    public abstract void close();

    public abstract void run();

    public abstract void stop();
}

打开状态:

public class OpenState extends State {

    @Override
    public void open() {
        System.out.println("当前状态:打开状态");
    }

    @Override
    public void close() {
        super.context.setState(Context.CLOSE_STATE);
        super.context.close();
    }

    @Override
    public void run() {
        // 打开状态时不能运行
    }

    @Override
    public void stop() {
        // 打开状态时就是停止状态
    }
}

关闭状态:

public class CloseState extends State {

    @Override
    public void open() {
        super.context.setState(Context.OPEN_STATE);
        super.context.open();
    }

    @Override
    public void close() {
        System.out.println("当前状态:关闭状态");
    }

    @Override
    public void run() {
        super.context.setState(Context.RUN_STATE);
        super.context.run();
    }

    @Override
    public void stop() {
        super.context.setState(Context.STOP_STATE);
        super.context.stop();
    }
}

运行状态:

public class RunState extends State {

    @Override
    public void open() {
        // 运行状态时不能打开
    }

    @Override
    public void close() {
        // 运行状态时就是关闭状态
    }

    @Override
    public void run() {
        System.out.println("当前状态:运行状态");
    }

    @Override
    public void stop() {
        super.context.setState(Context.STOP_STATE);
        super.context.stop();
    }
}

停止状态:

public class StopState extends State {

    @Override
    public void open() {
        super.context.setState(Context.OPEN_STATE);
        super.context.open();
    }

    @Override
    public void close() {
        super.context.setState(Context.CLOSE_STATE);
        super.context.close();
    }

    @Override
    public void run() {
        super.context.setState(Context.RUN_STATE);
        super.context.run();
    }

    @Override
    public void stop() {
        System.out.println("当前状态:停止状态");
    }
}

上下文:

public class Context {

    public static final State OPEN_STATE = new OpenState();

    public static final State CLOSE_STATE = new CloseState();

    public static final State RUN_STATE = new RunState();

    public static final State STOP_STATE = new StopState();

    private State state;

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

    public State getState() {
        return this.state;
    }

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

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

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

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

}

测试:

public class StateTest {

    public static void main(String[] args) {
        Context context = new Context();
        context.setState(Context.STOP_STATE);

        context.open();
        context.close();
        context.run();
        context.stop();
    }
}

测试结果:

当前状态:打开状态
当前状态:关闭状态
当前状态:运行状态
当前状态:停止状态

6、状态模式的源码分析

404

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

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

相关文章

使用预授权签名加速 BSV 有状态合约更新

状态更新竞争 BSV 智能合约将状态存储在交易链的输出中。 当交易花费包含旧状态的输出并创建包含新状态的输出时,就会发生状态转换。 在任何给定时间,交易链末端的单个输出/UTXO 都具有最新状态。 当多个事务竞争同时更新共享状态时,就会出…

Anchor2

Anchor也是第二季了~~ 来一起来学习Faster R-CNN中的RPN及Anchor 说到RPN和Anchor,应该立马就能想到Faster R-CNN网络框架 首先我先将几类经典的目标检测网络做一个对比,然后开始说说今天要讲的知识。 最开始出现的是R-CNN,如下图&#xff…

什么是编程?程序员主要做啥工作?如何学习呢?

对编程的理解 编程换成通俗的语言可以理解为使用一些英文单词组成的指令发送给计算机,做指定的事情。 编程的种类 如今在互联网市场中,编程的工作一共分为了3大类: 前端编程 后台编程 运维编程 前端编程: 什么是前端&#…

门诊地图导航怎么做,零成本的医院室内导航解决方案

现在很多医院都比较大,科室众多,往往让人不知道要找的科室在哪里,不了解看病的流程,只能去咨询台询问,费时又费力……电子地图作为大家最喜闻乐见的高效应用形式,可高效为病患提供导医服务,并为…

XML介绍和基本用法(一文彻底搞懂XML!)

文章目录1.XML1.1概述1.2标签的规则1.3语法规则1.4xml解析1.5DTD约束1.6schema约束1.XML 1.1概述 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年,又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者: Tim Berners-Lee (蒂姆伯纳斯李…

智能图像水位识别监测 基于OpenCv

智能图像水位识别监测利用OpenCVyolo网络学习模型对河道江河湖泊等区域进行实时监测,当监测到水位刻度尺超标时立即抓拍。OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉处理开源软件库,支持与计算机视觉和机器…

【Linux】编辑器的天花板vim

​🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉前言&…

14.SpringAop

1. Aop简介 AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构 OOP(Object Oriented Programming)面向对象编程 作用:在不惊动原始设计的基础上为其进行功能增强。简单的说就是在不改变方法源代码的基…

C语言必背18个经典程序

1、/*输出9*9口诀。共9行9列&#xff0c;i控制行&#xff0c;j控制列。*/ #include "stdio.h" main() {int i,j,result;for(i1;i<10;i){for(j1;j<10;j){resulti*j;printf("%d*%d%-3d",i,j,result);/*-3d表示左对齐&#xff0c;占3位*/}printf("…

数字化转型必读书籍:27个案例让小白也能搞懂以中台战略主导的数字化转型产品建设

各位茶馆的读者朋友们大家好&#xff0c;一转眼《中台产品经理宝典》一书已经上市了2年半&#xff0c;在这期间创造了近2万册的销售记录&#xff0c;并多次冲上各大网站的销售记录。 就在今年双十一还创造了当当网细分类目销量第71名的成绩&#xff0c;这对一本已经出版了2年半…

LeetCode题解 15 (5,96) 最长回文子串,不同的二叉搜索树

文章目录最长回文子串代码解答&#xff1a;不同的二叉搜索树代码解答&#xff1a;最长回文子串 首先我们应该先了解什么是回文子串: 单个字符 例如 a 这也是回文字符串 2个字符 aa 或者 bb 这也是回文字符串 3个字符 aba 或者 bab 多个字符 abba ababa 这些也被叫做回文子串 从…

【源码透视】SpringBoot的SPI机制

一、从java类加载机制说起 java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器Bootstrap ClassLoader、Extension ClassLoader和System ClassLoader&#xff08;Application ClassLoader&#xff09…

开源项目 Spartacus 的 git 提交流程规范

Spartacus 开源项目由一组库组成。为了更容易知道哪个版本的库与另一个版本兼容&#xff0c;库版本在所有包中同步。 这意味着当我们要发布 1.5.0 版本时&#xff0c;我们会发布该版本下的所有库&#xff0c;即使某些库与上一个版本相比没有任何变化。 这样一来&#xff0c;我们…

NKOJ P5676 SuperGCD【超级GCD】

为什么NKOJ的题交JAVA会被keyword卡System&#xff0c;还不能用python水高精度…… 题目分析 回归正题&#xff0c;由于本题数据范围0≤A,B≤10100000 \le A,B \le 10^{10000}0≤A,B≤1010000两个100001000010000位的整数算GCD,所以用高精度欧几里得GCD的话会使得算法时间复杂…

数据治理工程师必备证书DAMA-CDGA/CDGP,含金量高

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

Nacos的Java SDK

配置管理 在界面上添加配置 我们在界面上新建了一个json类型的配置 使用SDK来获取配置 public String getConfig(String dataId, String group, long timeoutMs) throws NacosException名称类型描述dataIdstring配置 ID&#xff0c;采用类似 package.class&#xff08;如com…

10分钟vue初步入门

基础原理 使用vue开发&#xff0c;对于新手需要了解的两个关键点是 MVVM MVC模式变化而来&#xff0c;相对于MVC强调控制-模型-视图的责任分离之外&#xff0c;最大的特点就是引入ViewModel&#xff0c;支持双向绑定 比如你改变一个输入框 Input 标签的值&#xff0c;会自动…

仓库管理系统GreaterWMS的安装

本文是应网友 ubuntu 和 Nathan 要求写的&#xff1b;因为看起来 Nathan 比较着急&#xff0c;就突击了一下&#xff0c;因为时间仓促&#xff0c;错误在所难免&#xff0c;敬请谅解~ 什么是 GreaterWMS &#xff1f; GreaterWMS是完全开源的仓库管理系统。该库存管理系统是目前…

心脏病_冠心病智能预测模型(人工智能,机器学习,用于论文作业_专利_企业建模__项目申报_科研报告,收藏)

作者Toby&#xff0c;来自心脏病_冠心病智能预测模型 ​ 心脏病&#xff08;heart disease&#xff09;是心脏疾病的总称&#xff0c;包括风湿性心脏病、先天性心脏病、高血压性心脏病、冠心病、心肌炎等各种心脏病。 人体“发动机” 心脏是一个强壮的、不知疲倦、努力工作的…

更适合运动的耳机,设计时尚轻巧好用,南卡Runner CC3上手

很多喜欢健身的朋友&#xff0c;在锻炼的时候都会戴上一副耳机&#xff0c;这样可以在音乐的节奏中享受运动的乐趣。在运动耳机当中&#xff0c;骨传导耳机是这两年很受欢迎的一种类型&#xff0c;相比于更常见的真无线耳机&#xff0c;骨传导耳机因为特殊的发声方式&#xff0…