1 定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
2 解决的问题
状态模式主要用于解决:当控制一个对象状态转换的表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的逻辑简化。
3 优势
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
4 使用场景
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以使用状态模式。
5 例子
5.1 场景
人一天有4个工作状态,上午、中午、下午、晚上。这个四个时间段的工作状态都是不同的,也就是不同的时间决定了不同的工作状态。通过采用状态模式的设计思想,展现人一天的工作状态。
5.2 UML图
5.3 代码
Work类中有State,工作根据State的不同,状态也不同。
Main
public class Main {
public static void main(String[] args) {
Work work=new Work();
work.setHour(9);
//根据时间的不同,工作状态也不同
work.writeProgram();
work.setHour(12);
work.writeProgram();
work.setHour(16);
work.writeProgram();
work.setHour(18);
work.setFinish(true);
work.writeProgram();
}
}
Work
public class Work {
//以什么样的状态工作
private State state;
private double hour;
private boolean finish=false;
public Work(){
state=new ForenoonState();
}
public void writeProgram(){
state.writeProgram(this);
}
//---------------以下是get set方法----------
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
}
State
public abstract class State {
public abstract void writeProgram(Work work);
}
ForenoonState
public class ForenoonState extends State {
@Override
public void writeProgram(Work work){
if(work.getHour()<12){
System.out.println(String.format("当前时间:%s点 上午工作,精神倍爽",work.getHour()));
}else{
work.setState(new NoonState());
work.writeProgram();
}
}
}
NoonState
public class NoonState extends State {
@Override
public void writeProgram(Work work){
if(work.getHour()<13){
System.out.println(String.format("当前时间:{0}点 午休",work.getHour()));
}else{
work.setState(new AfternoonState());
work.writeProgram();
}
}
}
AfternoonState
public class AfternoonState extends State {
@Override
public void writeProgram(Work work){
if(work.getHour()<12){
System.out.println(String.format("当前时间:%s点 下午工作,状态不错",work.getHour()));
}else{
work.setState(new EveningState());
work.writeProgram();
}
}
}
EveningState
public class EveningState extends State {
@Override
public void writeProgram(Work work){
if(work.isFinish()){
work.setState(new RestState());
work.writeProgram();
}else{
if(work.getHour()<21){
System.out.println(String.format("当前时间:%s点 加班哦,疲惫至极",work.getHour()));
}else{
work.setState(new SleepingState());
work.writeProgram();
}
}
}
}
SleepingState
public class SleepingState extends State {
@Override
public void writeProgram(Work work){
System.out.println(String.format("当前时间:%s点 睡着了",work.getHour()));
}
}
RestState
public class RestState extends State {
@Override
public void writeProgram(Work work){
System.out.println(String.format("当前时间:%s点 下班回家",work.getHour()));
}
}
运行结果:
当前时间:9.0点 上午工作,精神倍爽
当前时间:12.0点 午休
当前时间:16.0点 下午工作,状态不错
当前时间:18.0点 下班回家