设计模式之状态模式
状态模式
当一个对象的内部状态改变时允许改变其行为,这个对象看起来就像是改变了其类一样
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时,把状态判断的逻辑转移到不同状态的一系列类当中,从而把复杂的逻辑判断简单化,
状态模式结构图
//一系列特定状态行为的接口
public abstract class State {
public abstract void printfCurrentState(Work work);
}
//早上状态类
public class MorningState extends State {
@Override
public void printfCurrentState(Work work) {
if (work.getTime() <= 12) {
System.out.println("当前时间是早上工作状态");
} else {
work.setState(new NoonState());
work.currentWorkState();
}
}
}
//中午状态类
public class NoonState extends State {
@Override
public void printfCurrentState(Work work) {
if (work.getTime() <= 14) {
System.out.println("当前时间是中午时间状态!");
} else {
work.setState(new AfternoonState());
work.currentWorkState();
}
}
}
//下午状态类
public class AfternoonState extends State {
@Override
public void printfCurrentState(Work work) {
if (work.getTime() <= 18) {
System.out.println("当前时间是下午工作状态!");
if (work.getTime() == 18) {
work.setFinish(true);
}
} else {
if(work.isFinish()) {
work.setState(new WorkFinish());
work.currentWorkState();
} else {
work.setState(new NightState());
work.currentWorkState();
}
}
}
}
//晚上实体类
public class NightState extends State {
@Override
public void printfCurrentState(Work work) {
if(work.isFinish()) {
work.setState(new WorkFinish());
work.currentWorkState();
return;
}
if (work.getTime() < 24 ) {
System.out.println("现在是晚上加班时间工作状态");
} else {
if (work.getTime() >= 24) {
work.setTime(0);
}
work.setState(new EarlyState());
work.currentWorkState();
}
}
}
//凌晨加班实体类
public class EarlyState extends State {
@Override
public void printfCurrentState(Work work) {
if(work.isFinish()) {
work.setState(new WorkFinish());
work.currentWorkState();
return;
}
if (work.getTime() <= 2) {
System.out.println("现在是凌晨加班工作状态!已经坚持不住了!");
} else {
work.setState(new ForcedWork());
work.currentWorkState();
}
}
}
//工作Context类
public class Work {
private State state;
private int time;
private boolean isFinish;
public boolean isFinish() {
return isFinish;
}
public void setFinish(boolean finish) {
isFinish = finish;
}
public Work(){
time = 9;
state = new MorningState();
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public void currentWorkState(){
System.out.print("当前时间是:" + time + "-----");
state.printfCurrentState(this);
}
}
//测试代码
public class EarlyState extends State {
@Override
public void printfCurrentState(Work work) {
if(work.isFinish()) {
work.setState(new WorkFinish());
work.currentWorkState();
return;
}
if (work.getTime() <= 2) {
System.out.println("现在是凌晨加班工作状态!已经坚持不住了!");
} else {
work.setState(new ForcedWork());
work.currentWorkState();
}
}
}
//测试客户端代码
public class TestMain {
public static void main(String[] args) throws InterruptedException {
Work work = new Work();
for(int i = 9; i <= 24; i++) {
work.setTime(i);
work.currentWorkState();
if (i == 24) {
i = 0;
}
Thread.sleep(2000);
}
}
}
输出结果如下
总结
状态模式的好处是减少大量的条件分支语句,而且减少了state类各个子类之间的依赖关系,
当一个对象的行为取决于它的状态,并且必须是在运行时改变它的状态的时候,这个时候则可以考虑使用状态模式。