八、状态模式

概念

允许对象在内部状态变化时,改变它的行为,看起来就像是对象本身发生了变化一样

应用场景

有些对象的行为依赖于内部状态的变化,使用状态模式,每个状态维护一个独立的类,使得对象状态切换更加清晰。避免使用大量if-else

基本结构

1)环境类‏(Context)؜:持有当前状态对象؜,负责状态的切换,⁡同时对外暴露统一的‍行为接口。

2)状态‏接口(State):定义所؜有具体状态需要实现的接口؜或者抽象类

3)具体状态‏类(ConcreteSt؜ate):实现抽象状态定؜义的行为,每个具体状态类⁡封装了对应的操作逻辑,并‍且可以决定是否切换到其他状态

代码实现

以 ‏“订单状态流转管理؜” 为例

状态接口

声明订单的所有状态操作

要求不同状态的类都要实现对应的处理方法

public interface OrderState {
    void handleRequest(Order order); // 处理订单请求,根据不同状态执行不同操作
}

具体状态类

每个状态都作为一个类来实现

每个状态类都实现了 OrderState 接口的 handleRequest() 方法,具体的操作会根据当前状态执行相应的逻辑

public class PendingState implements OrderState {
    @Override
    public void handleRequest(Order order) {
        System.out.println("订单处于待支付状态,请支付。");
        order.setState(new PaidState()); // 支付完成后,改变订单状态为已支付
    }
}
public class PaidState implements OrderState {
    @Override
    public void handleRequest(Order order) {
        System.out.println("订单已支付,请发货。");
        order.setState(new ShippedState()); // 发货后,改变订单状态为已发货
    }
}
public class ShippedState implements OrderState {
    @Override
    public void handleRequest(Order order) {
        System.out.println("订单已发货,请等待接收。");
        order.setState(new CompletedState()); // 完成后,改变订单状态为已完成
    }
}
public class CompletedState implements OrderState {
    @Override
    public void handleRequest(Order order) {
        System.out.println("订单已完成。");
    }
}

环境类

管理当前订单状态并切换状态

包含表示“状态”的成员变量,提供改变状态的方法和当前状态下的处理方法

public class Order {
    private OrderState state;

    public Order() {
        this.state = new PendingState(); // 初始状态为“待支付”
    }

    public void setState(OrderState state) {
        this.state = state;
    }

    public void request() {
        state.handleRequest(this); // 调用当前状态的处理方法
    }
}

客户端调用

public class Client {
    public static void main(String[] args) {
        Order order = new Order();  // 创建一个订单

        // 客户端操作:订单请求
        order.request();  // 初始状态是“待支付”

        // 模拟状态流转
        order.request();  // 订单支付后,进入“已支付”状态
        order.request();  // 订单发货后,进入“已发货”状态
        order.request();  // 订单完成后,进入“已完成”状态
    }
}

优缺点

优点

1)简化复杂条件语句:省略了不同状态的if-else语句

2)易于扩展:每增加一种状态时,我们只需要创建一个新的状态类

缺点

1)状态之间的转换复杂:如果状态之间的转换规则比较复杂,可能会导致状态类之间的耦合度较高

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇