状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为。这种模式通过把状态的变化逻辑分布到State的子类之间,减少了相互间的依赖,使得状态的切换更加清晰。
状态模式的关键是将那些会随着状态改变而改变的行为抽离出来,使得状态和行为可以独立变化,不同状态下的行为可以分别管理和修改,增加新的状态或者改变状态间的转换逻辑变得更加容易。
假设我们有一个工作任务(Task)对象,这个对象有几个状态:New(新创建的任务),InProgress(正在进行的任务),Completed(已完成的任务)。我们可以使用状态模式来设计这个场景。
首先,定义一个状态接口和实现该接口的具体状态类。
- interface State {
- void proceed(Task task);
- }
-
- class New implements State {
- public void proceed(Task task) {
- System.out.println("Task is starting.");
- task.setState(new InProgress());
- }
- }
-
- class InProgress implements State {
- public void proceed(Task task) {
- System.out.println("Task is in progress.");
- task.setState(new Completed());
- }
- }
-
- class Completed implements State {
- public void proceed(Task task) {
- System.out.println("Task is already completed.");
- }
- }
然后,创建包含状态的Task类。
- class Task {
- private State state;
-
- public Task() {
- // 任务默认状态为 New
- this.state = new New();
- }
-
- public void setState(State state) {
- this.state = state;
- }
-
- public void proceed() {
- state.proceed(this);
- }
- }
最后,演示如何使用状态模式来改变Task对象的状态。
- public class StatePatternDemo {
- public static void main(String[] args) {
- Task task = new Task();
-
- task.proceed(); // Task is starting.
- task.proceed(); // Task is in progress.
- task.proceed(); // Task is already completed.
- }
- }
在这个示例中,Task对象的行为随着其内部状态的改变而改变,而且状态的变更逻辑被封装在状态对象内部。这样,如果未来需要添加新的状态或者改变状态转换的逻辑,我们只需要修改或添加相应的状态类,而不需要触及到Task类的内部逻辑,这就是使用状态模式的好处。