状态者模式的概念
状态者模式(State Pattern),也称为状态模式,是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。状态者模式把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化。状态者模式将每个状态封装成一个类,并在每个状态类中实现该状态下对应的行为。同时,状态者模式会定义一个上下文环境(Context),它负责维护当前的状态对象,并在状态改变时调用新的状态对象的方法。
状态者模式的优缺点
优点:
- 将状态和逻辑分开:状态者模式将状态和逻辑分开,实现了代码的解耦,有利于后期新状态的添加。
- 简化逻辑判断:通过将状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化。
- 扩展性好:当有新的状态出现时,可以通过添加新的状态类来进行扩展。
缺点:
- 状态类过多:如果状态过多,会导致有非常多的状态类,加大了开销。
- 可能违反开闭原则:虽然状态者模式本身不直接违反开闭原则,但如果在设计过程中不恰当地添加新状态或修改现有状态,可能会违反开闭原则。
状态者模式的应用场景
- 交通灯:交通信号灯可以有三种状态:红灯、黄灯和绿灯。当灯的状态发生改变时,它的行为也会发生改变。
- 游戏中的角色:角色可以处于攻击状态、防御状态或者逃跑状态。每个状态都有一些不同的行为。
- 电梯:电梯有多种状态,例如停止、上行、下行等。当电梯的状态发生改变时,它的行为也会相应地发生改变。
状态者模式的代码实现
以下是一个简化的状态者模式的代码实现示例,以电梯为例:
// 抽象状态接口 | |
public interface State { | |
void handleRequest(); // 处理请求的方法 | |
} | |
// 具体状态类:停止状态 | |
public class StopState implements State { | |
private Elevator elevator; | |
public StopState(Elevator elevator) { | |
this.elevator = elevator; | |
} | |
@Override | |
public void handleRequest() { | |
System.out.println("电梯处于停止状态,禁止所有人员进出"); | |
// 在这里可以添加状态转换的逻辑,例如当接收到启动请求时切换到上行或下行状态 | |
} | |
} | |
// 电梯类(上下文环境) | |
public class Elevator { | |
private State state; | |
public Elevator() { | |
this.state = new StopState(this); // 初始状态为停止状态 | |
} | |
// 处理请求的方法,委托给当前状态对象处理 | |
public void request() { | |
state.handleRequest(); | |
} | |
// 设置电梯状态的方法 | |
public void setState(State state) { | |
this.state = state; | |
} | |
} |
在这个示例中,State
是一个抽象状态接口,定义了处理请求的方法。StopState
是具体状态类之一,实现了State
接口,并在handleRequest
方法中定义了停止状态下的行为。Elevator
类是上下文环境,它维护了一个当前状态对象,并在处理请求时将请求委托给当前状态对象处理。同时,Elevator
类还提供了设置电梯状态的方法。