Java 设计模式-状态模式

目录

[一. 概述](#一. 概述)

[二. 主要角色](#二. 主要角色)

[三. 代码示例](#三. 代码示例)

[四. 优缺点](#四. 优缺点)

优点:

缺点:

[五. 常见应用场景](#五. 常见应用场景)


一. 概述

状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定的状态相关的行为放到一个类中,并且将请求委托给当前状态对象来执行。

在状态模式中,我们创建表示各种状态的对象和一个行为随状态对象改变而改变的Context对象。

二. 主要角色

状态模式主要包含三个角色

  1. **Context(上下文):**维护一个指向当前状态对象的引用,这个引用指向的状态对象定义了在特定时间对象将如何响应请求。

  2. **State(状态接口):**定义一个接口,以封装与Context的某个状态相关的行为。

  3. **Concrete State(具体状态):**实现State接口,并且包含与特定状态相关的行为。

三. 代码示例

以啊坤身体状态为例(健康和骨折的阿坤):

  1. 健康的阿坤:会唱、跳、rap。

  2. 骨折的阿坤:唱、rap。

代码示例:

  1. 定义状态接口

    java 复制代码
    package com.demo.status;
    
    /**
     * 文件名:State
     * 创建者:
     * 创建时间:2024-09-08
     * 描述:定义状态接口
     */
    public interface State {
        //定义行为方法
        void action();
    }
  2. 定义状态接口的实现类1(健康的阿坤)

    java 复制代码
    package com.demo.status;
    
    /**
     * 文件名:HealthState
     * 创建者:
     * 创建时间:2024-09-08
     * 描述:状态接口实现类
     * 健康状态下的行为:唱、跳、rap
     */
    public class HealthState implements State{
        @Override
        public void action() {
            System.out.println("实习一坤年的健康练习生会:唱、跳、rap");
    
        }
    }
  3. 定义状态接口的实现类2(骨折的阿坤)

    java 复制代码
    package com.demo.status;
    
    /**
     * 文件名:FractureState
     * 创建者:
     * 创建时间:2024-09-08
     * 描述:状态接口实现类
     * 骨折状态下的行为: 只能唱、rap
     */
    public class FractureState implements State{
        @Override
        public void action() {
            System.out.println("实习一坤年的骨折练习生只会:唱和rap");
        }
    }
  4. 定义环境类(也就是上下文类)

    java 复制代码
    package com.demo.status;
    
    /**
     * 文件名:Context
     * 创建者:
     * 创建时间:2024-09-08
     * 描述:环境类
     */
    public class Context {
        //持有状态接口的引用
        private State state;
    
        public Context(State state) {
            this.state = state;
        }
        public void setState(State state) {
            this.state = state;
        }
    
        public void request() {
            state.action(); // 委托给当前状态处理请求
        }
    }
  5. 测试类

    java 复制代码
    package com.demo.status;
    
    /**
     * 文件名:Main
     * 创建者:
     * 创建时间:2024-09-08
     * 描述:测试类
     */
    public class Main {
        public static void main(String[] args) {
    
            //创建实现类对象(健康的啊坤)
            HealthState healthState = new HealthState();
    
            //创建实现类对象(骨折的啊坤)
            FractureState fractureState = new FractureState();
    
            //通过给环境传入不同的对象,执行不同的方法(传入一个健康的阿坤)
            Context healthContext = new Context(healthState);
            healthContext.request();
    
            //通过给环境传入不同的对象,执行不同的方法(传入一个骨折的阿坤)
            Context fractureContext = new Context(fractureState);
            fractureContext.request();
    
        }
    }
  6. 测试结果

四. 优缺点

优点:

封装性好: 将状态转换逻辑封装在状态类中,减少了Context类的复杂性。
扩展性好: 可以方便地添加新的状态类,满足开闭原则。
**状态转换清晰:**状态转换逻辑明确,易于理解和维护。

**避免庞大的条件分支语句:**避免了在上下文类中使用大量的条件分支语句来根据状态改变行为。

缺点:

增加系统复杂性: 随着状态的增多,类的数量也会增多,可能导致系统变得复杂。
**可能增加系统开销:**每个状态都是一个对象,可能会增加内存开销。

五. 常见应用场景

状态模式常用于处理对象多种状态转换的情况如:

  1. 订单状态管理:待支付、已支付、已发货、已完成等状态转换。
  2. 工作流引擎:任务的不同执行阶段(如待处理、处理中、已完成)。
  3. 网络连接状态:连接中、已连接、断开连接等。
  4. UI组件的交互状态:如按钮的可用/禁用状态。
相关推荐
铁蛋AI编程实战10 分钟前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘21 分钟前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays101123 分钟前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
前端不太难27 分钟前
HarmonyOS 游戏里,Ability 是如何被重建的
游戏·状态模式·harmonyos
摇滚侠34 分钟前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.39 分钟前
java多态
java·开发语言·c++
李堇42 分钟前
android滚动列表VerticalRollingTextView
android·java
泉-java1 小时前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
zfoo-framework1 小时前
帧同步和状态同步
java
charlotte102410242 小时前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络