首页 > 编程语言 >Java 设计模式-状态模式

Java 设计模式-状态模式

时间:2024-09-10 19:23:15浏览次数:13  
标签:状态 Java 对象 state 模式 State Context 设计模式 public

目录

一. 概述

二. 主要角色

三. 代码示例

四. 优缺点

优点:

缺点:

五. 常见应用场景


一. 概述

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

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

二. 主要角色

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

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

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

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

三. 代码示例

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

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

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

代码示例:

  1. 定义状态接口
    package com.demo.status;
    
    /**
     * 文件名:State
     * 创建者:
     * 创建时间:2024-09-08
     * 描述:定义状态接口
     */
    public interface State {
        //定义行为方法
        void action();
    }
    
  2. 定义状态接口的实现类1(健康的阿坤)
    package com.demo.status;
    
    /**
     * 文件名:HealthState
     * 创建者:
     * 创建时间:2024-09-08
     * 描述:状态接口实现类
     * 健康状态下的行为:唱、跳、rap
     */
    public class HealthState implements State{
        @Override
        public void action() {
            System.out.println("实习一坤年的健康练习生会:唱、跳、rap");
    
        }
    }
    
  3. 定义状态接口的实现类2(骨折的阿坤)
    package com.demo.status;
    
    /**
     * 文件名:FractureState
     * 创建者:
     * 创建时间:2024-09-08
     * 描述:状态接口实现类
     * 骨折状态下的行为: 只能唱、rap
     */
    public class FractureState implements State{
        @Override
        public void action() {
            System.out.println("实习一坤年的骨折练习生只会:唱和rap");
        }
    }
    
  4. 定义环境类(也就是上下文类)
    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. 测试类
    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组件的交互状态:如按钮的可用/禁用状态。

标签:状态,Java,对象,state,模式,State,Context,设计模式,public
From: https://blog.csdn.net/weixin_39865508/article/details/142034862

相关文章

  • Java 设计模式-代理模式
    目录概述一.什么是代理模式1.举例说明二.代理模式作用1.保护代理2.增强功能3.代理交互4.远程代理:三.代理模式3个角色四.静态代理1.代码示例:五.JDK动态代理1.代码示例:六.CGLIB动态代理1.代码示例 七.JDK动态代理和CGLIB动态代理区别八.两种在......
  • [设计模式] Cola-StateMachine : 一个轻量实用的Java状态机框架
    1概述:状态机1.0状态机vs工作流在介绍状态机之前,先介绍一个工作流(WorkFlow),初学者通常容易将两个概念混淆。工作流(WorkFlow),大体是指业务过程(整体或者部分)在计算机应用环境下的自动化,是对工作流程及其各操作步骤之间业务规则的描述。在计算机系统中,工作流属于计算机支持的......
  • Dagger:Android 和 Java 的快速依赖注入框架
    在软件开发中,依赖注入(DI)是一种设计模式,用于实现控制反转,减少代码耦合,提高模块化。Dagger是一个由Google开发的依赖注入库,专门用于Android和Java应用程序,以其快速和高效著称。文章目录......
  • 力扣474-一和零(Java详细题解)
    题目链接:474.一和零-力扣(LeetCode)前情提要:因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。如果大家感兴趣,......
  • 06JAVA第一次考试选择
    判断正确1,不含公共类的JAVA源文件名称可以随便命名,不受任何限制。2,编译当前路径下的HelloWorld.java文件,使用的命令是:javacHelloWorld.java。3,JamesGosling是Java语言的创始人之一。4,Java语言的标识符区分大小写。5,java.lang包的Character类的isJavaIdentifierStart方......
  • Java中日期时间类的学习
    日期时间类目录日期时间类Date类(日期时间)SimpleDateFormat类(格式化)Calendar类(日历)Date类(日期时间)序号方法和描述1booleanafter(Datedate)若当调用此方法的Date对象在指定日期之后返回true,否则返回false。2booleanbefore(Datedate)若当调用此方法的Date......
  • 基于Java web社区公共安全管理系统(源码+lw+部署文档+讲解等)
    文章目录前言......
  • 基于Java技术的车辆故障管理软件的设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言......
  • JAVA并发编程AQS原理剖析
    很多小朋友面试时候,面试官考察并发编程部分,都会被问:说一下AQS原理。面对并发编程基础和面试经验,专栏采用通俗简洁无废话无八股文方式,已陆续梳理分享了《一文看懂全部锁机制》、《JUC包之CAS原理》、《volatile核心原理》、《synchronized全能王的原理》,希望可以帮到大家巩固相......
  • Activity启动模式
    Activity启动模式1.Activity启动模式介绍1.1任务栈在Android开发中,任务栈(TaskStack)是一个非常重要的概念,主要用于管理应用程序中的Activity及其启动模式。它帮助开发者了解当用户在不同应用之间切换,或者应用内部不同Activity之间跳转时,系统如何管理这些Activity的生命周期与......