1、准确定义:
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
2、解决的问题:
状态模式主要用于解决:当控制一个对象状态转换的表达式过于复杂时。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的逻辑简化。
3、优势:
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
4、适用场景:
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
5、UML图:
6、例子:
6.1、场景:
人一天有4个工作状态,上午、中午、下午、晚上。这个四个时间段的工作状态都是不同的,也就是不同的时间决定了不同的工作状态。通过采用状态模式的设计思想,展现人一天的工作状态。
6.2、UML图:
6.3、code:
代码结构图如下:
代码具体实现:
package designmodel.sixteenthchapter;
/**
* @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();
}
}
}
package designmodel.sixteenthchapter;
/**
* @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();
}
}
}
package designmodel.sixteenthchapter;
/**
* @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();
}
}
package designmodel.sixteenthchapter;
/**
* @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,"+"继续加班,疲惫至极!!!");
}
}
}
package designmodel.sixteenthchapter;
/**
* @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();
}
}
}
package designmodel.sixteenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/14 22:40
* @ProjectName: JavaBaseTest
*/
public abstract class State {
abstract void handler(Work work);
}
package designmodel.sixteenthchapter;
/**
* @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);
}
}
参考书籍:《大话设计模式》-程杰