大话设计模式——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 策略模式

  • 状态模式重在各个状态之间的切换从而有不同的行为,策略模式重在根据具体情况选择策略不涉及状态的切换
  • 状态模式不同状态做不同的事情且不能相互替换,策略模式解决的都是同一件事
相关推荐
Cc.Y1 分钟前
Java零基础入门:字符串深度掌握——从基础API到StringBuilder性能优化
java·开发语言·性能优化
shuoshuohaohao5 小时前
MyBatis 小知识点
java·spring·mybatis
海上小飞龙5 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
谢亮_vipxieliang6 小时前
泛型擦除、通配符与 PECS 一次讲透
java·面试
八解毒剂6 小时前
【计组】中央处理器CPU
java·开发语言·计算机组成原理
打工仔折腾 AI7 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战
ZealSinger7 小时前
Java虚拟线程上线后瓶颈转移到哪看三层
java·开发语言·firefox
2601_961133287 小时前
盘立方软件指标文华期货公式下载
java
蜗牛互联网7 小时前
长任务多Agent共享文件系统的Manifest交接模式
java·人工智能·后端
Sirens.7 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法