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组件的交互状态:如按钮的可用/禁用状态。
相关推荐
xyliiiiiL3 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing4 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
腥臭腐朽的日子熠熠生辉1 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian1 小时前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之1 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码1 小时前
Spring Task 定时任务
java·前端·spring
俏布斯2 小时前
算法日常记录
java·算法·leetcode
27669582922 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿
爱的叹息2 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
程序猿chen2 小时前
《JVM考古现场(十五):熵火燎原——从量子递归到热寂晶壁的代码涅槃》
java·jvm·git·后端·java-ee·区块链·量子计算