状态模式

作者: fancy_boy_石嘉成 | 来源:发表于2018-07-29 17:46 被阅读1次

《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。
目录:设计模式
Github地址:DesignPattern

说明

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

UML图:

状态模式UML图.png

代码实现:

State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。

abstract class State{
    public abstract void Handle(Context context);
}

ConcreteState类,具体状态。每一个子类实现一个与Context的一个状态相关的行为。

class ConcreteStateA extends State {

    @Override
    public void Handle(Context context) {
        context.setState(new ConcreteStateB());
    }
}

class ConcreteStateB extends State {

    @Override
    public void Handle(Context context) {
        context.setState(new ConcreteStateA());
    }
}

Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。

class Context{
    private State state;
    // 定义Context的初始状态
    public Context(State state){
        this.state = state;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
        System.out.println("当前状态:"+state);
    }

    // 对请求做处理,并设置下一状态
    public void Request(){
        state.Handle(this);
    }
}

客户端代码

public class StatePattern {
    public static void main(String[] args){
        Context context = new Context(new ConcreteStateA());
        context.Request();
        context.Request();
        context.Request();
        context.Request();
    }
}

运行结果

当前状态:com.shijc.dp.state.ConcreteStateB@4554617c
当前状态:com.shijc.dp.state.ConcreteStateA@74a14482
当前状态:com.shijc.dp.state.ConcreteStateB@1540e19d
当前状态:com.shijc.dp.state.ConcreteStateA@677327b6

示例

例子:程序员的一天往往是比较固定的,上午的时候精神百倍,中午饿了犯困,需要午休;下午精神还不错,如果能准时下班必是极好的;但是如果加班到晚上,傍晚比较疲惫,如果加班到很晚,那就困极了睡着了。用程序模拟这个过程。

UML图:

状态模式示例UML图.png

代码实现:

抽象状态类,定义一个抽象方法"写程序"

public abstract class WorkState {
    public abstract void WriteProgram(Work w);
}

上午工作状态

public class ForenoonState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.getHour()<12){
            System.out.println("当前时间:"+ w.getHour()+"点 上午工作,精神百倍");
        }else {
            w.setState(new NoonState());
            w.WriteProgram();
        }

    }
}

中午工作状态

public class NoonState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.getHour()<13){
            System.out.println("当前时间:"+ w.getHour()+"点 饿了,犯困,午休");
        }else {
            w.setState(new AfternoonState());
            w.WriteProgram();
        }

    }
}

下午工作状态

public class AfternoonState extends WorkState {
    @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 WorkState {
    @Override
    public void WriteProgram(Work w) {
        if (w.isFinish()){
            w.setState(new RestState());
            w.WriteProgram();
        }else {
            if (w.getHour()<21){
                System.out.println("当前时间:"+ w.getHour()+"点 加班哦,疲累至极");
            }else {
                w.setState(new SleepingState());
                w.WriteProgram();
            }
        }


    }
}

睡眠工作状态

public class SleepingState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        System.out.println("当前时间:"+ w.getHour()+"点 不行了,睡着了");

    }
}

下班状态

public class RestState extends WorkState {
    @Override
    public void WriteProgram(Work w) {
        System.out.println("当前时间:"+ w.getHour()+"点 下班回家了");

    }
}

工作类

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

    public double getHour() {
        return hour;
    }

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

    public boolean isFinish() {
        return finish;
    }

    public void setFinish(boolean finish) {
        this.finish = finish;
    }

    public void setState(WorkState state){
        current = state;
    }

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

客户端代码

public class Main {
    public static void main(String[] args){
        Work emergencyProjects = new Work();
        emergencyProjects.setHour(9);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(10);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(12);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(13);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(14);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(17);

        emergencyProjects.setFinish(false);

        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(19);
        emergencyProjects.WriteProgram();
        emergencyProjects.setHour(22);
        emergencyProjects.WriteProgram();
    }
}

运行结果

当前时间:9.0点 上午工作,精神百倍
当前时间:10.0点 上午工作,精神百倍
当前时间:12.0点 饿了,犯困,午休
当前时间:13.0点 下午状态还不错,继续努力
当前时间:14.0点 下午状态还不错,继续努力
当前时间:17.0点 加班哦,疲累至极
当前时间:19.0点 加班哦,疲累至极
当前时间:22.0点 不行了,睡着了

相关文章

  • State模式

    状态模式(State模式) 定义 状态模式,又称状态对象模式(Pattern of Objects for S...

  • 设计模式-状态模式

    设计模式-状态模式 设计模式 状态模式的关键是区分事物内部的状态

  • 状态模式(状态机模式)

    状态模式学习笔记 前言:文章从三方面简单阐述状态模式:是什么、为什么、如何做。这是我在工作之余自己的一些理解、思考...

  • C++设计模式(3)

    本文预览: 状态模式 组合模式 迭代器 职责链 命令 状态模式 定义:状态模式(State Pattern),允许...

  • 设计模式——状态模式

    定义 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行...

  • 第5章 -行为型模式-状态模式

    一、状态模式的简介 二、状态模式的优缺点 三、状态模式的实例

  • 状态模式

    Android进阶之设计模式 状态模式 定义: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了...

  • 状态模式

    状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。允许对象随着状态改变而改变行为。 策略...

  • 状态模式

    《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代...

  • 状态模式

    状态模式 一个对象有状态变化 每次状态变化都会触发一个逻辑 不能总是用 if...else 来控制 示例 交通灯信...

网友评论

    本文标题:状态模式

    本文链接:https://www.haomeiwen.com/subject/zmctvftx.html