什么是状态模式,有哪些应用?

一、定义及应用场景:

**状态模式允许一个对象在其内部状态发生改变时改变它的行为,使其看起来像是修改了其类。**它通过将对象的行为包装在不同状态对象中,实现了在运行时更改对象的状态,从而影响其行为。

状态模式也有很多实际的应用场景,如:

1、订单状态管理:订单状态有很多种,如未付款、已付款、已发货、已签收等。不同状态下,订单的行为也不同。

2、游戏角色状态:游戏角色的状态有很多种,如待机、行走、攻击、受伤等。不同状态下,角色的行为也不同。

3、音视频播放器:音视频播放器的状态有很多种,如播放、暂停、停止、快进、快退等。不同状态下,播放器的行为也不同。

在实际应用中,状态模式通常需要和其他设计模式结合使用,例如工厂模式、单例模式、策略模式等,以实现更灵活和高效的代码设计。

二、示例

假设我们正在为一个订单系统,需要管理他的状态,比如它包含了已创建、已支付、已发货、已完成、已取消等状态。

首先定义一个状态接口:

复制代码
public interface OrderState {
    void next (Order order) ;
    void previous (Order order) ;
    void printStatus() ;
}

然后定义具体的状态类,为每个具体状态实现上述接口。这里以两个状态为例:已创建和已支付。

复制代码
public class CreatedState implements OrderState {
    @Override
    public void next(Order order) {
        order.setState(new PaidState() ) ;
    }
    @Override
    public void previous(Order order) {
        System.out.println("The order is in its root state");
    }
    @Override
    public void printStatus() {
        System.out.print1n("Order created.");
    }
}

public class PaidState implements OrderState {
    @Override
    public void next (Order order) {
        order.setState(new ShippedState()) ;
}
    @Override
    public void previous(Order order) {
        order.setState(new CreatedState()) ;
}
    @Override
    public void printStatus() {
        System.out.println("Order paid.") ;
    }
}

最后定义一个Order类,持有一个状态对象的引用,通过该状态对象的方法实现状态的切换。

复制代码
public class Order {
    private OrderState state ;
    public Order() {
        //订单初始化状态为已创建
        this.state = new CreatedState() ;
    }
    public void setState(OrderState state ) {
        this.state = state ;
    }
    public OrderState getState() {
        return this.state ;
    }
    public void nextStep() {
        state.next(this) ;
    }
    public void previousStep() { 
        state.previous(this) ;
    }
    public void printStatus( ) {
        state.printStatus() ;
    }
}

使用示例如下:

复制代码
public class StatePatternDemo {
    public static void main(String[ ] args) {
        Order order = new Order() ;
        order.printStatus() ;
        order.nextStep() ;
        order.printStatus() ;
        order.nextStep() ;
        order.printStatus() ;
    }
}

在这个例子中,Order对象根据其内部状态的改变(通过调用nextStep或previousStep方法)表现出了不同的行为。这就是状态模式的精髓:它将对象在不同状态下的行为封装到不同的状态对象中,使得状态的转换逻辑清晰,且易于扩展。

相关推荐
皮卡蛋炒饭.9 分钟前
线程的概念和控制
java·开发语言·jvm
一只大袋鼠18 分钟前
MyBatis 入门详细实战教程(一):从环境搭建到查询运行
java·开发语言·数据库·mysql·mybatis
程序员老邢27 分钟前
【人生底稿・番外篇 05】我的电影江湖:从录像带时代,到港片陪伴的青春岁月
java·程序人生·职场发展·娱乐
sonnet-102932 分钟前
函数式接口和方法引用
java·开发语言·笔记
Bat U36 分钟前
JavaEE|多线程(二)
java·开发语言
_Evan_Yao43 分钟前
RAG中的“Chunk”艺术:我试过10种切分策略后总结的结论
java·人工智能·后端·python·软件工程
魂梦翩跹如雨1 小时前
数据库的“契约” —— 约束(Constrains)
java·数据库·mysql
独自破碎E2 小时前
面试官:你有用过Java的流式吗?比如说一个列表.stream这种,然后以流式去处理数据。
java·开发语言
胡志辉的博客2 小时前
多智能体协作,不是多开几个 Agent:从中介者模式看 OpenClaw 和 Hermes Agent
人工智能·设计模式·ai·agent·中介者模式·openclaw·herman
shark22222222 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式