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