03-JAVA设计模式-状态模式

状态模式

什么是状态模式

Java中的状态模式(State Pattern)是一种行为型设计模式,主要用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。状态模式允许一个对象在其内部状态改变时改变它的行为,使得对象看起来似乎修改了它的类。

优点:

  • 结构清晰:通过将状态转换逻辑分布到独立的状态类中,状态模式将对象的行为与对应的状态分离,使得代码结构更加清晰,易于理解。
  • 灵活性和可扩展性:状态模式使得在修改对象状态时,不需要修改对象的行为方法,从而提高了系统的灵活性和可扩展性。同时,新的状态可以很容易地引入,而无需修改已有的状态类或上下文。
  • 降低耦合度:状态模式将对象的状态从主体中分离出来并将其封装在独立的状态类中,使得主体和状态之间的耦合度降低,提高了系统的可维护性。

缺点:

  • 增加类和对象的个数:由于每个状态都被封装成独立的对象,因此状态模式可能会导致系统中类和对象的个数增加,从而增加系统的复杂度和实现难度。
  • 使用条件较为苛刻:状态模式要求将状态转换逻辑包含在具体状态类中,因此只适合状态不多且状态转换比较少的情况。如果状态机过于复杂,使用状态模式可能会导致系统的维护和扩展变得困难。

常见场景:

  • 任务状态管理:如任务的创建、进行中、暂停、完成等状态。
  • 订单状态管理:如订单的待支付、已支付、待发货、已发货、已完成等状态。
  • 线程状态管理:如线程的创建、就绪、运行、阻塞、终止等状态。

案例

通过状态模式实现订单状态管理

UML

实现步骤:

  • 创建订单状态接口,定义通过上限文处理订单状态的接口
  • 创建上限文,持有订单状态的引用,提供通过订单状态引用调用订单状态实现类的具体方法
  • 创建不同订单状态,实现订单状态接口的方法

实现代码

OrderState.java

java 复制代码
// 订单状态接口
public interface OrderState {
    void handleState(Context context);
}

Context.java

java 复制代码
// 上下文
public class Context {
    private OrderState orderState;
    public Context(OrderState orderState) {
        this.orderState = orderState;
    }
    public void setOrderState(OrderState orderState) {
        this.orderState = orderState;
    }
    public void request(){
        this.orderState.handleState(this);
    }
}

PlaceOrder.java

java 复制代码
// 下单
public class PlaceOrder implements OrderState {
    @Override
    public void handleState(Context context) {
        System.out.println("下单-当前状态:待支付");
    }
}

PayOrder.java

java 复制代码
// 支付
public class PayOrder implements OrderState {
    @Override
    public void handleState(Context context) {
        System.out.println("支付-当前状态:已支付");
    }
}

SendGoods.java

java 复制代码
// 发货
public class SendGoods implements OrderState {
    @Override
    public void handleState(Context context) {
        System.out.println("发货-当前状态:已发货");
    }
}

TestClient.java

java 复制代码
public class TestClient {
    public static void main(String[] args) {
        // 创建上下文
        Context context = new Context(new PlaceOrder());
        context.request();
        context.setOrderState(new PayOrder());
        context.request();
        context.setOrderState(new SendGoods());
        context.request();
    }
}

执行结果:

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

相关推荐
C_V_Better19 分钟前
Java Spring Boot 控制器中处理用户数据详解
java·开发语言·spring boot·后端·spring
胡子洲24 分钟前
Spring Boot 应用中实现基本的 SSE 功能
java·spring boot·后端
t1987512826 分钟前
基于Qt的OSG三维建模
java·开发语言
SoFlu软件机器人37 分钟前
Java 框架配置自动化:告别冗长的 XML 与 YAML 文件
xml·java·自动化
贰拾wan1 小时前
【Java-EE进阶】SpringBoot针对某个IP限流问题
java·spring boot·后端·idea
青云交1 小时前
【金仓数据库征文】-- 金仓数据库:技术实践天花板级深度解析,手把手教你玩转企业级应用
java·性能调优·集群部署·金仓数据库 2025 征文·数据库平替用金仓·金仓数据库·语法兼容
敲代码的 蜡笔小新1 小时前
【行为型之观察者模式】游戏开发实战——Unity事件驱动架构的核心实现策略
观察者模式·unity·设计模式·c#
Paran-ia1 小时前
【2025版】Spring Boot面试题
java·spring boot·后端
LUCIAZZZ1 小时前
JVM之虚拟机运行
java·jvm·spring·操作系统·springboot
hello_ejb32 小时前
聊聊JetCache的缓存构建
java·前端·缓存