【Java设计模式】简单学状态模式——老板,我顶不住了,快不行了

目录

说明

实现方式

优点

缺点

应用场景

其他链接


说明

  • 行为型模式之一,其他还有命令模式、模板方法模式、访问者模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、迭代器模式、策略模式、职责链模式(责任链模式)
  • 状态模式( State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一 一对应的,状态之间可以相互转换
  • 效果:把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化

实现方式

当紧急项目一来,所有人都在赶。早上状态很好,下午状态一般,晚上状态疲惫,入夜便顶不住了。

【Java设计模式】简单学状态模式——老板,我顶不住了,快不行了_第1张图片

 

public class StateTest {

    public static void main(String[] args) {
        EmergencyProject emergencyProject = new EmergencyProject();
        emergencyProject.setHour(9);
        emergencyProject.program();
        emergencyProject.setHour(11);
        emergencyProject.program();
        emergencyProject.setHour(13);
        emergencyProject.program();
        emergencyProject.setHour(18);
        emergencyProject.program();
        emergencyProject.setHour(20);
        // 工作完成
        emergencyProject.setWorkFinished(true);
        emergencyProject.program();
    }
}

/**
 * 紧急项目
 * 

* * @author ZRH * @version 1.0.0 * @date 2020/7/23 */ class EmergencyProject { /** * 工作状态 */ private WorkState currentState; /** * 当前钟点 */ private Integer hour; /** * 手头工作是否完成 */ private Boolean workFinished = false; /** * 默认上班是早晨 */ public EmergencyProject() { currentState = new ForenoonState(); } /** * 敲代码 *

* * @author ZRH * @date 2020-07-23 * @version 1.0.0 */ public void program() { currentState.program(this); } public Boolean getWorkFinished() { return workFinished; } public void setWorkFinished(Boolean workFinished) { this.workFinished = workFinished; } public Integer getHour() { return hour; } public void setHour(Integer hour) { this.hour = hour; } public void setWorkState(WorkState workState) { currentState = workState; } } /** * 工作状态 *

* * @author ZRH * @version 1.0.0 * @date 2020/7/23 */ abstract class WorkState { /** * 编程 *

* * @param emergencyProject * @author : ZRH * @version : 1.0.0 * @date : 2020-07-23 */ public abstract void program(EmergencyProject emergencyProject); } /** * 早上状态 *

* @author ZRH * @date 2020/7/23 * @version 1.0.0 */ class ForenoonState extends WorkState { private static final int TWELVE_HOUR = 12; /** * 编程 *

* * @param emergencyProject * @author : ZRH * @version : 1.0.0 * @date : 2020-07-23 */ @Override public void program(EmergencyProject emergencyProject) { if (emergencyProject.getHour() < TWELVE_HOUR) { System.out.println(emergencyProject.getHour() + "点,精神充沛"); } else { emergencyProject.setWorkState(new AfternoonState()); emergencyProject.program(); } } } /** * 下午状态 *

* @author ZRH * @date 2020/7/23 * @version 1.0.0 */ class AfternoonState extends WorkState { private static final int SEVENTEEN_HOUR = 17; /** * 编程 *

* * @param emergencyProject * @author : ZRH * @version : 1.0.0 * @date : 2020-07-23 */ @Override public void program(EmergencyProject emergencyProject) { if (emergencyProject.getHour() < SEVENTEEN_HOUR) { System.out.println(emergencyProject.getHour() + "点,状态还行"); } else { emergencyProject.setWorkState(new EveningState()); emergencyProject.program(); } } } /** * 晚上状态 *

* @author ZRH * @date 2020/7/23 * @version 1.0.0 */ class EveningState extends WorkState { private static final int TWENTY_ONE_HOUR = 21; /** * 编程 *

* * @param emergencyProject * @author : ZRH * @version : 1.0.0 * @date : 2020-07-23 */ @Override public void program(EmergencyProject emergencyProject) { if (emergencyProject.getWorkFinished()) { System.out.println("工作完成"); System.out.println(emergencyProject.getHour() + "点,下班"); } else { if (emergencyProject.getHour() < TWENTY_ONE_HOUR) { System.out.println(emergencyProject.getHour() + "点,疲累至极"); } else { System.out.println("太晚了,顶不住了"); } } } }


优点

  • 方便维护。将容易产生问题的if-else语句删除了,如果把每个状态的行为都放到一个类中,每次调用方法时都要判断当前是什么状态,不但会产出很多if-else语句,而且容易出错
  • 符合“开闭原则”。容易增删状态

缺点

  • 会产生很多类。每个状态都要一个对应的类,当状态过多时会产生很多类,加大维护难度

应用场景

  • 当一个事件或者对象有很多种状态,状态之间会相互转换,对不同的状态要求有不同的行为的时候,可以考虑使用状态模式
  • 当控制一个对象状态转换的条件表达式过于复杂的情况

其他链接

【Java设计模式】简单学工厂模式

【Java设计模式】简单学抽象工厂模式

【Java设计模式】简单学建造者模式

【Java设计模式】简单学单例模式

【Java设计模式】简单学原型模式

【Java设计模式】其他模式~

你可能感兴趣的:(Java设计模式)