嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:
状态模式是一种行为型设计模式,允许对象在内部状态发生改变时改变它的行为。它适用于行为随状态改变而改变的场景,如一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。状态模式的核心是状态与行为绑定,不同的状态对应不同的行为。它定义了各种状态类,每个状态类中定义了对应的状态行为,并且状态类之间通过继承实现状态的转移。通过使用状态模式,可以将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足单一职责原则。
状态模式的核心角色包括:
状态模式很简单,也很容易理解,这里我举一个生活中的小例子来说明一下:比如我,平时一般都是7点钟起床开始洗漱,8点钟开车出门,9点钟到达公司,开始进入作状态,这就是简单朴实的一天。类似这种不同的状态或时刻,会触发一些固定的动作,并且动作之间具有一定的连贯性,使用状态模式就是一个比较好的选择。如果使用状态模式来模拟一下起床去上班这个过程,应该怎么实现呢?
1、TaskState.java:声明抽象的任务状态,即抽象状态角色,封装了特定时刻下的行为;
/**
* 任务状态抽象
*/
public abstract class TaskState {
/**
* 任务在某个状态时,做一些事
*/
public abstract void doSomething(TaskContext taskContext);
}
2、TaskContext.java:任务的上下文环境,持有一个任务状态,并定义了当前任务状态一下具体动作;
/**
* 任务管理上下文
*/
public class TaskContext {
private TaskState taskState;
public TaskState getTaskState() {
return taskState;
}
public void setTaskState(TaskState taskState) {
this.taskState = taskState;
}
public void handle(){
this.taskState.doSomething(this);
}
}
3、SevenState.java、EightState.java、NineState.java:继承于抽象的任务状态,是具体状态,分别实现了7点钟、8点钟、9点钟时的特定动作;
/**
* 7点钟的任务
*/
public class SevenState extends TaskState{
@Override
public void doSomething(TaskContext taskContext) {
System.out.println("7:00>起床洗漱");
taskContext.setTaskState(new EightState());
}
}
/**
* 8点状的任务
*/
public class EightState extends TaskState{
@Override
public void doSomething(TaskContext taskContext) {
System.out.println("8:00>开车出门去上班");
taskContext.setTaskState(new NineState());
}
}
/**
* 9点钟的任务
*/
public class NineState extends TaskState{
@Override
public void doSomething(TaskContext taskContext) {
System.out.println("9:00>到达公司,开始工作");
}
}
4、Client.java:编写业务客户端把各任务状态整合到上下文环境中;
public class Client {
public static void main(String[] args) {
SevenState sevenState = new SevenState();
TaskContext taskContext = new TaskContext();
taskContext.setTaskState(sevenState);
taskContext.handle();
taskContext.handle();
taskContext.handle();
}
}
状态模式适用于处理一个对象在其内部状态改变时,其行为也随之改变的场景。具体来说,状态模式适用于以下特征的业务场景:
例如,在视频播放的业务场景中,播放器有初始状态、播放状态、暂停状态、停止状态、快进状态等多种状态,将这些状态都封装到代表不同状态的类中,可以将复杂的判断逻辑简化,将这些逻辑扩展到不同的状态类中。
此外,状态模式还适用于电梯运行、购买物品等场景。在电梯运行场景中,电梯的运行状态包括停止、上行、下行等,不同状态下行为不同。在购买物品场景中,可以将购物车中的商品订单状态封装到代表不同状态的类中,如未付款、已付款、已取消等状态,简化判断逻辑并提高代码可读性和可维护性。
在实现上,状态模式增加了系统的类与对象的个数,并且状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。因此,在使用状态模式时需要注意其适用场景和优缺点,并根据实际情况进行权衡和选择。