• 3.8设计模式——State 状态模式(行为型)


    意图

    允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

    结构

    • Context(上下文)定义客户感兴趣的接口;维护一个ConcreteState子类的实例,这个实例定义当前状态。
    • State(状态)定义一个接口以封装与Context的一个特定状态相关的行为。
    • ConcreteState(具体状态子类)每个子类实现与Context的一个状态相关的行为。
    • Handle是一个代表处理当前状态的动作或方法的命名。在状态模式中,每个具体状态子类都会实现自己的 handle 方法,用来定义该状态下的具体行为或逻辑。当上下文调用 handle 方法时,实际执行的是当前状态对应的具体状态子类中的 handle 方法。

    适用性

    • 一个对象的行为决定于它的状态,并且它必须在运行时刻根据状态改变它的行为。
    • 一个操作中含有庞大的多分支条件语句,且这些分支依赖于该对象的状态。这个状态常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得开发者可以根据对象自身的情况将对象的状态作为一个对象,这个对象可以不依赖于其他对象独立变化。

    代码示例

    1. // 状态接口
    2. interface State {
    3. void handle();
    4. }
    5. // 具体状态子类A
    6. class ConcreteStateA implements State {
    7. @Override
    8. public void handle() {
    9. System.out.println("Handling state A");
    10. }
    11. }
    12. // 具体状态子类B
    13. class ConcreteStateB implements State {
    14. @Override
    15. public void handle() {
    16. System.out.println("Handling state B");
    17. }
    18. }
    19. // 上下文类
    20. class Context {
    21. private State currentState;
    22. public Context() {
    23. // 初始状态为A
    24. currentState = new ConcreteStateA();
    25. }
    26. public void setState(State state) {
    27. this.currentState = state;
    28. }
    29. public void request() {
    30. currentState.handle();
    31. }
    32. }
    33. // 测试
    34. public class StatePatternExample {
    35. public static void main(String[] args) {
    36. Context context = new Context();
    37. // 初始状态为A
    38. context.request();
    39. // 改变状态为B
    40. context.setState(new ConcreteStateB());
    41. context.request();
    42. }
    43. }

    在这个示例中,State接口定义了状态的行为,ConcreteStateA和ConcreteStateB是具体状态子类,分别实现了不同状态下的行为。Context类维护了一个当前状态的实例,根据当前状态来调用相应的行为。在测试中,创建了一个Context对象并初始化为状态A,然后改变状态为B并调用请求方法,观察输出结果。

  • 相关阅读:
    HashMap源码解析
    12-分频器 -偶分频
    matlab导入txt数据
    【CANN训练营】Ascend算子开发入门笔记
    uniapp/小程序 onload方法每次打开页面都执行解读
    第三章 第二节:参数的概念
    1.Vue—简介、实例与容器、MVVM模型
    2024全国水科技大会暨水环境新污染物控制青年学者论坛
    Dependency ‘org.redisson:redisson:‘ not found解决方法 三种刷新Maven项目的方法
    项目中多级缓存设计实践总结
  • 原文地址:https://blog.csdn.net/u011096468/article/details/138201761