状态模式

简介: 《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。目录:设计模式Github地址:DesignPattern说明定义:状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

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

说明

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

UML图:

img_dacd6acdbcdc13da91eddc4b16a3d538.png
状态模式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图:

img_3d03baeefcd5ce4507297b50d7a9d215.png
状态模式示例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点 不行了,睡着了
目录
相关文章
|
9天前
|
设计模式 算法
状态模式和策略模式有什么区别
状态模式和策略模式有什么区别
12 1
|
4月前
行为型 状态模式
行为型 状态模式
17 0
|
4月前
|
前端开发
状态模式
状态模式
27 0
状态模式的总结
状态模式的总结
|
10月前
|
设计模式 JavaScript
关于状态模式我所知道的
关于状态模式我所知道的
47 0
|
设计模式 算法 Java
状态模式和策略模式的区别与联系
UML 状态模式是策略模式的孪生兄弟,是因为它们的UML图是一样的。但意图却完全不一样,策略模式是让用户指定更换的策略算法,而状态模式是状态在满足一定条件下的自动更换,用户无法指定状态,最多只能设置初始状态。
|
设计模式
我学会了,状态模式
状态模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
84 0
我学会了,状态模式
|
存储 程序员 开发工具
状态模式与备忘录模式(2)
状态模式与备忘录模式(2)
119 0
状态模式与备忘录模式(2)
|
存储 Java Spring
状态模式与备忘录模式(3)
状态模式与备忘录模式(3)
117 0
状态模式与备忘录模式(3)
|
uml
状态模式与备忘录模式(1)
状态模式与备忘录模式(1)
75 0
状态模式与备忘录模式(1)