设计模式 - 状态模式(State Pattern)
介绍
状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变其行为。对象看起来像是改变了其类。此模式涉及到一个状态机,其中定义了一组状态以及从一个状态到另一个状态的转换条件。状态模式让多个类(状态)管理对象的内部状态,并且将状态的转换逻辑封装在这些状态类中。
实现
我们以一个简单的交通信号灯系统为例来展示状态模式的应用。假设交通信号灯系统有红灯、黄灯和绿灯三种状态,每种状态都有其特定的行为。
定义状态接口
首先定义一个状态接口,它声明了所有状态共有的行为。
interface TrafficLightState {
void handle();
}
创建具体状态类
然后创建具体的实现类,它们实现了 TrafficLightState
接口,并提供了特定状态下的行为。
class RedLight implements TrafficLightState {
private TrafficLight trafficLight;
public RedLight(TrafficLight trafficLight) {
this.trafficLight = trafficLight;
}
@Override
public void handle() {
System.out.println("Red Light is on...");
trafficLight.setState(trafficLight.getYellowLight());
}
}
class YellowLight implements TrafficLightState {
private TrafficLight trafficLight;
public YellowLight(TrafficLight trafficLight) {
this.trafficLight = trafficLight;
}
@Override
public void handle() {
System.out.println("Yellow Light is on...");
trafficLight.setState(trafficLight.getGreenLight());
}
}
class GreenLight implements TrafficLightState {
private TrafficLight trafficLight;
public GreenLight(TrafficLight trafficLight) {
this.trafficLight = trafficLight;
}
@Override
public void handle() {
System.out.println("Green Light is on...");
trafficLight.setState(trafficLight.getRedLight());
}
}
创建上下文类
接着创建一个上下文类,它持有一个状态对象,并提供了改变状态的方法。
class TrafficLight {
private TrafficLightState state;
private RedLight redLight;
private YellowLight yellowLight;
private GreenLight greenLight;
public TrafficLight() {
redLight = new RedLight(this);
yellowLight = new YellowLight(this);
greenLight = new GreenLight(this);
setState(redLight); // 初始状态设为红灯
}
public void setState(TrafficLightState state) {
this.state = state;
}
public TrafficLightState getRedLight() {
return redLight;
}
public TrafficLightState getYellowLight() {
return yellowLight;
}
public TrafficLightState getGreenLight() {
return greenLight;
}
public void changeLight() {
state.handle();
}
}
使用状态模式
接下来,在主程序中使用状态模式来模拟交通信号灯的状态变化。
public class TrafficSimulation {
public static void main(String[] args) {
TrafficLight trafficLight = new TrafficLight();
// 模拟信号灯的状态变化
for (int i = 0; i < 5; i++) {
trafficLight.changeLight();
}
}
}
使用场景
状态模式适用于以下情况:
- 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
- 控制状态转换的条件表达式过于复杂。
总结
状态模式通过将对象的状态及其行为封装在不同的类中,使得对象可以根据其内部状态的变化改变其行为。这种方式不仅增强了代码的可维护性和可扩展性,还能清晰地表达状态转换的逻辑。
以上就是状态模式的一个实现案例,希望这篇文章能帮助你理解状态模式的使用方式及其优势。
评论区