• 设计模式:状态模式



    状态模式(State Pattern)是一种行为型设计模式,用于解决对象在不同状态下的行为变化问题。状态模式允许对象在内部状态发生改变时改变其行为,使得对象的行为可以根据状态的改变而灵活变化。
    在状态模式中,对象的行为会根据其内部状态的改变而变化,但对外部来说,对象的接口保持一致。状态模式通过将对象的状态抽象成不同的类,每个状态类都实现了相同的接口,从而使得状态的切换和行为的变化更加清晰和可控。

    组件

    状态模式通常包含以下组件:

    1. 环境(Context):定义了客户端所感兴趣的接口,维护一个当前状态对象的引用。
    2. 抽象状态(State):定义了一个接口,用于封装与环境的一个特定状态相关的行为。
    3. 具体状态(Concrete State):实现了抽象状态接口,具体实现了与特定状态相关的行为。

    代码示例

    class Context {
        private State state;
         public void setState(State state) {
            this.state = state;
        }
         public void request() {
            state.handle(this);
        }
    }
     // 抽象状态类
    interface State {
        void handle(Context context);
    }
     // 具体状态类A
    class ConcreteStateA implements State {
        public void handle(Context context) {
            System.out.println("当前状态是A");
            // 在状态A下的具体操作
            context.setState(new ConcreteStateB());
        }
    }
     // 具体状态类B
    class ConcreteStateB implements State {
        public void handle(Context context) {
            System.out.println("当前状态是B");
            // 在状态B下的具体操作
            context.setState(new ConcreteStateA());
        }
    }
     // 客户端代码
    public class Main {
        public static void main(String[] args) {
            Context context = new Context();
            context.setState(new ConcreteStateA());
             context.request();
            context.request();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在上述示例中,我们定义了一个环境类(Context)和两个具体状态类(ConcreteStateA和ConcreteStateB),它们都实现了抽象状态类(State)的接口。在环境类中,我们维护了一个当前状态对象的引用,并提供了切换状态和执行请求的方法。具体状态类实现了在特定状态下的具体操作,并在操作完成后切换到另一个状态。

    客户端代码中,我们创建了一个环境对象,并初始设置为具体状态A。然后通过调用环境对象的请求方法,可以触发状态的切换和相应状态下的操作。

    这个示例展示了如何使用Java实现状态模式,通过状态对象的切换来改变对象的行为。状态模式可以使得对象的行为随状态的改变而变化,提高代码的可维护性和可扩展性。

    源码中使用

    在源码中,状态模式有很多应用。以下是一些常见的源码中使用状态模式的情况:

    1. 订单状态管理:在电子商务系统中,订单通常具有多个状态,如待支付、已支付、已发货等。使用状态模式可以将每个状态封装成一个状态类,并在订单对象中管理和切换状态。
    2. 线程状态管理:在Java中,线程具有多个状态,如新建、运行、等待等。使用状态模式可以将每个状态封装成一个状态类,并通过状态转换来管理线程的状态。
    3. 游戏角色状态管理:在游戏开发中,游戏角色通常具有多个状态,如正常、受伤、死亡等。使用状态模式可以将每个状态封装成一个状态类,并在游戏角色对象中管理和切换状态。
    4. 交通信号灯控制:交通信号灯具有多个状态,如红灯、绿灯、黄灯等。使用状态模式可以将每个状态封装成一个状态类,并在信号灯对象中管理和切换状态。

    优缺点

    优点:

    1. 将状态相关的行为封装到不同的状态类中,使得状态转换更加明确和简化,提高代码的可读性和可维护性。
    2. 遵循开闭原则,当需要新增状态时,只需新增对应的状态类,而无需修改现有代码。
    3. 将状态转换逻辑集中管理,避免了大量的条件语句,提高了代码的可扩展性和灵活性。
    4. 状态模式可以让对象在不同状态下具备不同的行为,使得对象的行为更加动态和可定制。
      缺点:
    5. 状态模式会增加类的数量,每个状态都需要一个对应的状态类,如果状态较多,会导致类的数量增加,增加了系统的复杂性。
    6. 当状态转换较为复杂时,可能会导致状态类之间的交互复杂,增加了代码的理解和维护难度。
    7. 如果状态之间存在共享的数据,可能需要在各个状态类之间传递数据,增加了数据传递的开销和复杂性。

    总结

    状态模式通过将状态封装成独立的状态类,使得状态转换更加清晰和简化,提高了代码的可读性和可维护性。它遵循开闭原则,具有良好的扩展性和灵活性。然而,状态模式也会增加类的数量和复杂性,需要权衡使用。

  • 相关阅读:
    解决“error C267 ‘Beep_Led_yellow‘ requires ANSI-style prototype”错误方法
    Gartner 存储与数据保护技术 Hype Cycle 解读|SmartX 趋势分享
    关于这个“这是B站目前讲的最好的【Transformer实战】教程!“视频的目前可以运行的源代码GPU版本
    别看了!亚马逊选品工具全都在这儿了(上)
    C++11特性——thread_local
    私藏小技巧:让微信朋友圈营销方便化的小窍门!
    字符串函数——sprintf 用法集锦(清晰明了版)
    app逆向(9)|APP关于抓包的常见问题
    动态内存分配:malloc、calloc、realloc(超详解析,多维度分析,小白一看就懂!!!!)
    SpringBoot :ch01 项目结构
  • 原文地址:https://blog.csdn.net/qq_27586963/article/details/132945870