• 设计模式 21 状态模式


    参考源

    行为型:状态模式_哔哩哔哩_bilibili


    状态模式(State Pattern)属于行为型模式

    概述

    在标准大气压下,在 0 ~ 100 度之间时,会呈现液态;在 0 度以下会变成固态;100 度以上会变成气态。

    物质在不同的条件下呈现不同的状态,对象可能也会像这样存在很多种状态,在不同的状态下可能会有不同的行为,可以通过状态模式来实现这样的效果。

    代码实现

    下面以水的三种状态对应的不同行为来介绍状态模式:

    1、定义状态

    1. /**
    2. * 状态
    3. */
    4. public enum State {
    5. /**
    6. * 液态
    7. */
    8. LIQUID,
    9. /**
    10. * 固态
    11. */
    12. SOLID,
    13. /**
    14. * 气态
    15. */
    16. GASEOUS
    17. }

    2、定义水

    1. /**
    2. * 水
    3. */
    4. public class Water {
    5. /**
    6. * 状态
    7. */
    8. public State state;
    9. /**
    10. * 设置状态
    11. * @param state 状态
    12. */
    13. public void setState(State state) {
    14. this.state = state;
    15. }
    16. /**
    17. * 行为
    18. */
    19. public void action() {
    20. // 不同的状态对应不同的行为
    21. switch (this.state) {
    22. case LIQUID:
    23. System.out.println("水,内有千丘外无锋。风怒吼,狂澜卷巨峰。");
    24. break;
    25. case SOLID:
    26. System.out.println("水,寒彻三尺非日艰。钢铁骨,千钧无纹动。");
    27. break;
    28. case GASEOUS:
    29. System.out.println("水,飘洒随风影无踪。心高远,直上九重天。");
    30. break;
    31. default:
    32. System.out.println("未知");
    33. }
    34. }
    35. }

    3、调用

    1. // 定义水
    2. Water water = new Water();
    3. // 液态
    4. water.setState(State.LIQUID);
    5. water.action();
    6. // 固态
    7. water.setState(State.SOLID);
    8. water.action();
    9. // 气态
    10. water.setState(State.GASEOUS);
    11. water.action();

    输出结果为:

    1. 水,内有千丘外无锋。风怒吼,狂澜卷巨峰。
    2. 水,寒彻三尺非日艰。钢铁骨,千钧无纹动。
    3. 水,飘洒随风影无踪。心高远,直上九重天。

    可以看到,将水设置为不同状态后,其行为就会发生改变,体现出其状态对应的行为,这就是状态模式。

    优缺点

    优点

    1、封装了转换规则。

    2、枚举可能的状态,在枚举状态之前需要确定状态种类。

    3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。

    4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。

    5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

    缺点

    1、状态模式的使用必然会增加系统类和对象的个数。

    2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

    3、状态模式对开闭原则的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

    使用场景

    1、行为随状态改变而改变的场景。

    2、条件、分支语句的代替者。

    注意事项

    一般在行为受状态约束且状态不超过 5 个时,使用状态模式。

  • 相关阅读:
    开源笔记leanote搭建记录
    linux 3.13版本nvme驱动阅读记录三
    Leetcode—547.省份数量【中等】
    1024 漏洞综合项目演示(第十七课)
    C++ 类的非静态数据成员默认初始化
    maven项目正在idea的创建和配置
    Java设计模式——代理模式
    【LeetCode与《代码随想录》】哈希表篇:做题笔记与总结-JavaScript版
    建筑机械相关温、振、应力、动力、拖动、作业标准汇集
    用声明式宏解析 Rust 语法之 enum parser
  • 原文地址:https://blog.csdn.net/qq_37770674/article/details/126396389