《大话设计模式》java实现之状态模式

状态模式、策略模式、责任链模式三者非常像,今天花了很多时间查找他们之间的不同,博客https://www.cnblogs.com/xibei666/p/6858145.html总结得很好,这里简单总结一下。现在总结如下:
UML图状态模式和策略模式基本一致
状态模式
《大话设计模式》java实现之状态模式_第1张图片
策略模式
《大话设计模式》java实现之状态模式_第2张图片
从UML图可以看出,状态模式和策略模式完全一样,细微的区别主要是状态模式各状态子类知道下一状态是谁,且要把逻辑判断转移到各个状态子类中,客户端不需要了解状态迁移的顺序,但是策略目的是针对单一算法的运行时替换,客户端需要事先了解策略,主动去选择合适的策略,不存在状态的自动迁移!
责任链的职责不彼此依赖,不知道下一个职责是谁,组装过程可以由环境动态配置,很灵活,如struts里的filter的顺序可以由xml指定。
其实设计模式的初衷主要是优化代码,同一个问题着重点不同,因此可以选用不同的模式,只要起到优化代码的功能,其实没必要太过注重叫什么名字。
重写书中的代码时,只重写了其中的三个状态,并且把State由抽象类改成了接口,往知悉。
代码结构《大话设计模式》java实现之状态模式_第3张图片

public class AfternoonState implements State {

    @Override
    public void writeProgram(Work w) {
        System.out.println("当前时间: " + w.getHour() + "下午状态还不错,继续努力");
    }

}
public class Client {
    public static void main(String[] args) {
        Work emergencyProjects = new Work();
        emergencyProjects.setHour(9);
        emergencyProjects.writeProgram();

        emergencyProjects.setHour(12);
        emergencyProjects.writeProgram();

        emergencyProjects.setHour(13);
        emergencyProjects.writeProgram();
    }
}
public class ForenoonState implements State {

    @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 implements State {

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

}
public interface State {
    void writeProgram(Work w);
}
public class Work {
    private State current;
    private int hour;

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

    public int getHour() {
        return hour;
    }

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

    public Work() {
        current = new ForenoonState(); //工作状态初始化为上午工作状态,即9点开始上班
    }

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

运行结果
《大话设计模式》java实现之状态模式_第4张图片

你可能感兴趣的:(《大话设计模式》java实现之状态模式)