解决的问题:
解决:当控制一个对象状态转换的表达式过于复杂时。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的逻辑简化。
代码结构图如下:
代码具体实现:
/**
- @Author: cxh
- @CreateTime: 18/1/14 22:59
- @ProjectName: JavaBaseTest
*/
public class AfterNoonState extends State {
@Override
void handler(Work work) {
int curTime=work.time;
if(curTime<=18){
System.out.println("当前时间是:"+curTime+":00:00"+",效率一般的工作着");
}else{
work.setState(new NightState());
work.working();
}
}
}
/**
- @Author: cxh
- @CreateTime: 18/1/14 22:49
- @ProjectName: JavaBaseTest
*/
public class BeforeNoonState extends State {
@Override
void handler(Work work) {
int currTime=work.time;
if(currTime<12){
System.out.println("当前时间是:"+currTime+":00:00"+",精力充沛的工作");
}else{
work.setState(new NoonState());
work.working();
}
}
}
/**
-
@Author: cxh
-
@CreateTime: 18/1/14 23:12
-
@ProjectName: JavaBaseTest
*/
public class Client{
//test
public static void main(String[] args) {
Work work=new Work();
work.time=10;
work.working();
work.time=11;
work.working();
work.time=13;
work.working();
work.time=14;
work.working();
work.time=18;
work.working();
work.time=20;
work.working();
work.time=21;
work.working();
work.time=22;
work.isFinished=true;
work.working();
}
}
/**
- @Author: cxh
- @CreateTime: 18/1/14 23:00
- @ProjectName: JavaBaseTest
*/
public class NightState extends State{
@Override
void handler(Work work) {
if(work.isFinished){
System.out.println("今天工作已完成,准备回家~");
return;
}else{
int curTime=work.time;
System.out.println("当前时间是:"+curTime+":00:00,"+"继续加班,疲惫至极!!!");
}
}
}
/**
- @Author: cxh
- @CreateTime: 18/1/14 22:59
- @ProjectName: JavaBaseTest
*/
public class NoonState extends State {
@Override
void handler(Work work) {
int currTime=work.time;
if(currTime<=13){
System.out.println("当前时间是:"+currTime+":00:00"+",午饭后,休息中");
}else{
work.setState(new AfterNoonState());
work.working();
}
}
}
/**
- @Author: cxh
- @CreateTime: 18/1/14 22:40
- @ProjectName: JavaBaseTest
*/
public abstract class State {
abstract void handler(Work work);
}
/**
-
@Author: cxh
-
@CreateTime: 18/1/14 22:43
-
@ProjectName: JavaBaseTest
*/
public class Work{
//工作是否完成
public boolean isFinished=false;
//当前工作时间
public int time;
//工作状态
private State state;
Work(){
state=new BeforeNoonState();
}
//设置工作状态
public void setState(State state) {
this.state = state;
}
//工作中
public void working(){
state.handler(this);
}
}