大话设计模式——17.状态模式(State Pattern)

简介

对象的行为依赖于它的状态(属性),可以根据状态的改变而改变相关行为。

UML图:
应用场景:
  • 对象的行为取决于其状态,并且必须要在运行时刻根据状态而改变行为
  • 代码中包含大量与对象状态有关的条件语句

示例

上午、下午、晚上工作的状态

  1. 上下文对象:
java 复制代码
public class Work {

    /**
     * 工作状态
     */
    private State state;

    /**
     * 当前时间
     */
    private int hour;


    /**
     * 工作是否完成
     */
    private boolean isFinished;


    public Work() {
        // 初始化操作
        this.state = new MorningState();
    }

    public void writeProgram() {
        state.writeProgram(this);
    }


    public State getState() {
        return state;
    }

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

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        this.hour = hour;
    }

    public boolean isFinished() {
        return isFinished;
    }

    public void setFinished(boolean finished) {
        isFinished = finished;
    }
}
  1. 状态
java 复制代码
public interface State {

    void writeProgram(Work work);
}
java 复制代码
public class MorningState implements State {

    @Override
    public void writeProgram(Work work) {
        if (work.getHour() < 12) {
            System.out.println("当前时间:" + work.getHour() + ",干劲十足!");
        } else {
            work.setState(new NoonState());
            work.writeProgram();
        }
    }
}
java 复制代码
public class NoonState implements State {

    @Override
    public void writeProgram(Work work) {
        if (work.getHour() < 13) {
            System.out.println("当前时间:" + work.getHour() + ",好饿,开始干饭!");
        } else {
            work.setState(new AfternoonState());
            work.writeProgram();
        }
    }
}
java 复制代码
public class AfternoonState implements State {

    @Override
    public void writeProgram(Work work) {
        if (work.getHour() < 18) {
            System.out.println("当前时间:" + work.getHour() + ",开始上班,有点疲惫!");
        } else {
            work.setState(new EveningState());
            work.writeProgram();
        }
    }
}
java 复制代码
public class EveningState implements State {

    @Override
    public void writeProgram(Work work) {
        if (!work.isFinished()) {
            System.out.println("当前时间:" + work.getHour() + ",又要加班");
        } else {
            System.out.println("当前时间:" + work.getHour() + ",下班啦!");
        }
    }
}
  1. 运行
java 复制代码
public class Main {

    public static void main(String[] args) {
        Work work = new Work();
        // 上午
        work.setHour(9);
        work.writeProgram();

        // 中午
        work.setHour(12);
        work.writeProgram();

        // 下午
        work.setHour(16);
        work.writeProgram();

        // 晚上
        work.setHour(18);
//        work.setFinished(true);
        work.writeProgram();
    }
}

总结

  • 优点
    • 只需改变对象的状态,就可改变对象的行为
    • 多个环境对象共享一个状态对象,可以减少系统中对象的个数
  • 缺点
    • 增加系统类和对象的个数
    • 使用不当将造成程序结构和代码的混乱
    • 不符合开闭原则,新增状态需要修改源码

VS 策略模式

  • 状态模式重在各个状态之间的切换从而有不同的行为,策略模式重在根据具体情况选择策略不涉及状态的切换
  • 状态模式不同状态做不同的事情且不能相互替换,策略模式解决的都是同一件事
相关推荐
rannn_11119 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
灵感菇_19 小时前
Java HashMap全面解析
java·开发语言
qq_124987075319 小时前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
短剑重铸之日19 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
若鱼191919 小时前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王19 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
努力学编程呀(๑•ี_เ•ี๑)19 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
feasibility.19 小时前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
码农小卡拉20 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮20 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net