设计模式(12)状态模式

参考【设计模式】用Java实现状态模式_java 状态模式_卷帘的博客-CSDN博客

一、介绍:

1、状态模式:是一种行为设计模式,它允许对象在内部状态发生改变时改变其行为。该模式将对象的行为包装在不同的状态类中,使得对象的行为可以根据其当前状态动态改变。

2、组成:状态模式的核心思想是通过将对象的行为包装在不同的状态类中,使得对象可以根据其当前状态来改变行为,而不需要使用大量的条件判断语句。通常由以下几个角色组成:

(1)环境类(Context):环境类是拥有状态的对象,它将会根据当前状态来执行相应的行为。它维护了一个对抽象状态类的引用,用于切换和委托不同的状态处理。

(2)抽象状态类(State):抽象状态类定义了一个接口,用于具体状态类的实现。在该接口中声明了具体状态类需要实现的方法。

(3)具体状态类(Concrete State):具体状态类实现了抽象状态类的接口,并负责定义该状态下的具体行为。它包含了对环境类的引用,可以根据需要切换环境类的状态。

3、UML类图:

4、适用场景:

(1)当一个对象的行为取决于其内部状态,并且需要在运行时根据状态改变行为时,状态模式非常有用。它允许对象在不同状态下执行不同的操作,而不需要使用复杂的条件判断语句。

(2)当对象具有大量的状态以及与每个状态相关的行为时,状态模式可以提供一种结构化的方式来管理和组织这些状态和行为。每个状态都可以表示为一个独立的状态类,使得代码更加清晰、可读性更高。

(3)当需要向对象的状态变化进行动态扩展时,状态模式提供了一种灵活的解决方案。通过添加新的状态类,并相应地调整环境类与状态类之间的关联,可以轻松地增加新的状态和行为。

(4)当多个对象需要共享同一组状态时,状态模式可以减少重复代码的编写。通过将状态封装在独立的状态类中,多个对象可以共享相同的状态实例,从而节省内存和代码维护成本。

二、demo:

1、电商订单状态流转:

(1)环境类:

复制代码
// 环境类 - 订单
class Order {
    private OrderState state;
 
    public Order() {
        state = new NewState();
    }
 
    public void setState(OrderState state) {
        this.state = state;
    }
 
    public void process() {
        state.processOrder(this);
    }
}

(2)抽象状态类:

复制代码
// 抽象状态类
interface OrderState {
    void processOrder(Order order);
}

(3)具体状态类:

复制代码
// 具体状态类 - 新订单
class NewState implements OrderState {
    public void processOrder(Order order) {
        System.out.println("Processing new order");
        // 在新订单状态下的处理逻辑
        // ...
        order.setState(new ShippedState()); // 切换状态
    }
}
 
// 具体状态类 - 已发货订单
class ShippedState implements OrderState {
    public void processOrder(Order order) {
        System.out.println("Processing shipped order");
        // 在已发货订单状态下的处理逻辑
        // ...
        order.setState(new DeliveredState()); // 切换状态
    }
}
 
// 具体状态类 - 已交付订单
class DeliveredState implements OrderState {
    public void processOrder(Order order) {
        System.out.println("Processing delivered order");
        // 在已交付订单状态下的处理逻辑
        // ...
    }
}

(4)使用示例

复制代码
public class Main {
    public static void main(String[] args) {
        Order order = new Order();

        order.process(); // 处理新订单
        order.process(); // 处理已发货订单
        order.process(); // 处理已交付订单
    }
}
相关推荐
unable code4 小时前
磁盘取证-[第十章][10.1.2 磁盘取证方法]磁盘取证1
网络安全·ctf·misc·1024程序员节·内存取证
开开心心就好2 天前
免费抽奖工具支持批量导入+自定义主题
linux·运维·服务器·macos·pdf·phpstorm·1024程序员节
开开心心就好6 天前
卸载工具清理残留,检测垃圾颜色标识状态
linux·运维·服务器·python·安全·tornado·1024程序员节
子燕若水7 天前
Facebook reels 运营指南
1024程序员节
尘觉10 天前
创作 1024 天|把热爱写成长期主义
数据库·1024程序员节
写点什么呢11 天前
Word使用记录
word·1024程序员节
开开心心就好11 天前
内存清理工具点击清理,自动间隔自启
linux·运维·服务器·安全·硬件架构·材料工程·1024程序员节
开开心心就好11 天前
内存清理工具开源免费,自动优化清理项
linux·运维·服务器·python·django·pdf·1024程序员节
张萌杰15 天前
深度学习的基础知识(常见名词解释)
人工智能·深度学习·机器学习·1024程序员节
开开心心就好15 天前
免费无广告卸载工具,轻便安全适配全用户
linux·运维·服务器·网络·安全·启发式算法·1024程序员节