首页 > 其他分享 >(十六)状态模式

(十六)状态模式

时间:2022-11-29 20:46:31浏览次数:34  
标签:状态 writeProgram void Work 十六 模式 State public

1 概述

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

  • 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

2 好处与用法

  • 状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

  • 将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。

  • 目的是为了消除庞大的条件分支语句。

  • 状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。

  • 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

3 示例

抽象状态类,定义一个抽象方法“写程序”。

public abstract class State {
    public abstract void writeProgram(Work w);
}

上午和中午工作状态类。

public class ForenoonState extends State {
    @Override
    public void writeProgram(Work w) {
        if (w.getHour() < 12) {
            System.out.println("当前时间:" + w.getHour() + "点 精神百倍");
        } else {
            // 超过12点,则转入中午工作状态
            w.setState(new NoonState());
            w.writeProgram();
        }
    }
}
public class NoonState extends State {
    @Override
    public void writeProgram(Work w) {
        if (w.getHour() < 13) {
            System.out.println("当前时间:" + w.getHour() + "点 饿了,午饭;犯困,午休");
        } else {
            // 超过13点,则转入下午工作状态
            w.setState(new AfternoonState());
            w.writeProgram();
        }
    }
}

下午和傍晚工作状态类。

public class AfternoonState extends State {
    @Override
    public void writeProgram(Work w) {
        if (w.getHour() < 17) {
            System.out.println("当前时间:" + w.getHour() + "点 下午状态不错,继续努力");
        } else {
            w.setState(new EveningState());
            w.writeProgram();
        }
    }
}
public class EveningState extends State {
    @Override
    public void writeProgram(Work w) {
        if (w.isFinished()) {
            // 如果完成任务,则转入下班状态
            w.setState(new RestState());
        } else {
            if (w.getHour() < 21) {
                System.out.println("当前时间:" + w.getHour() + "点 加班中...");
            } else {
                // 超过21点,则转入睡眠工作状态
                w.setState(new SleepState());
                w.writeProgram();
            }
        }
    }
}

睡眠状态和下班休息状态类。

public class SleepState extends State {
    @Override
    public void writeProgram(Work w) {
        System.out.println("当前时间:" + w.getHour() + "点 不行了,睡着了");
    }
}
public class RestState extends State {
    @Override
    public void writeProgram(Work w) {
        System.out.println("当前时间:" + w.getHour() + "点 下班回家了");
    }
}

工作类,此时没有了过长的分支判断语句。

public class Work {
    private State current;
    public Work() {
        // 工作初始化为上午工作状态,即上午9点开始上班
        current = new ForenoonState();
    }
    // “钟点”属性,状态转换的依据
    private double hour;
    // “任务完成”属性,是否能下班的依据
    private boolean finished = false;


    public double getHour() {
        return hour;
    }

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

    public boolean isFinished() {
        return finished;
    }

    public void setFinished(boolean finished) {
        this.finished = finished;
    }

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

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

客户端代码。

public class Client {
    public static void main(String[] args) {
        Work w = new Work();
        w.setHour(9);
        w.writeProgram();
        w.setHour(10);
        w.writeProgram();
        w.setHour(12);
        w.writeProgram();
        w.setHour(13);
        w.writeProgram();
        w.setHour(14);
        w.writeProgram();
        w.setHour(17);
        w.writeProgram();
        // 未完成工作
        w.setFinished(false);
        w.setHour(19);
        w.writeProgram();
        w.setHour(22);
        w.writeProgram();
    }
}

当前时间:9.0点 精神百倍
当前时间:10.0点 精神百倍
当前时间:12.0点 饿了,午饭;犯困,午休
当前时间:13.0点 下午状态不错,继续努力
当前时间:14.0点 下午状态不错,继续努力
当前时间:17.0点 加班中...
当前时间:19.0点 加班中...
当前时间:22.0点 不行了,睡着了

Process finished with exit code 0

参考书籍:
《大话设计模式》

标签:状态,writeProgram,void,Work,十六,模式,State,public
From: https://www.cnblogs.com/dalelee/p/16935907.html

相关文章

  • C#设计模式读书笔记之设计模式的设计原则
    设计模式的设计原则:(重要性从上往下排列)开闭原则:对扩展开放,对修改关闭依赖倒转原则:高层模块不应该依赖底层模块,它们都应该依赖抽象;要针对抽象层编程,而不要针对具体类编程。......
  • C#数据结构-有限状态机
    有限状态机FSM的要点是:  拥有一组状态,并且可以在这组状态之间进行切换。  状态机同时只能在一个状态。  一连串的输入或事件被发送给机器。  每个状态都......
  • 有限状态机
    有限状态机简介有限状态机(FSM)是许多数字系统中用来控制系统和数据流路径行为的时序电路。FSM的实例包括控制单元和时序。本实验介绍了两种类型的FSM(Mealy和Moore)的概念,以......
  • 【最通俗易懂】C#有限状态机
    有限状态机表示有限个状态以及在这些状态之间的转换和动作等行为的数学模型。 有限状态机框架:Transitionenum:此枚举包含可由系统触发的转换标签。StateID枚举:这是游戏具......
  • WGCLOUD - 如何实现监测mysql主从节点同步状态是否正常
    WGCLOUD的自定义监控项,可以执行一些我们自定义的指令或脚本,非常灵活本文我们尝试使用此功能来监测我们的mysql从节点是否在正常工作,如果如下两项值都为yes,那么slave节点是......
  • Docker使用Calico网络模式配置及问题处理
    一.Calico介绍Calico是一种容器之间互通的网络方案,在虚拟化平台中,比如OpenStack、Docker等都需要实现workloads之间互连,但同时也需要对容器做隔离控制,就像在Internet中的......
  • angr_ctf——从0学习angr(二):状态操作和约束求解
    状态操作angr中提到的状态(state)实际上是一个Simstate类,该类可由Project预设得到。预设完成后,还可以根据需要对某些部分进行细化操作。一个state包含了程序运行到某个阶段......
  • 安卓设计模式演变之经典三层模型(MVC/MVP/MVVM)
    转载请标明出处!先看代码demo再回看文章效果最佳!目录​​一mvc​​​​1.1概述​​​​1.2 作用流程​​​​1.3 现状​​​​1.4致命弱点/缺点:​​​​1.5 代码Demo​......
  • Java内功修炼系列:代理模式及动态代理
    目录​​一代理模式​​​​1.1简介​​​​1.2代理模式角色定义​​​​二静态代理​​​​2.1介绍和实例​​​​2.2静态代理的缺点​​​​三动态代理​​​​3.1......
  • Android:按下与提起的状态background
    <?xmlversion="1.0"encoding="utf-8"?><selectorxmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:drawable="@color/btn_pressed_green_......