侧边栏壁纸
博主头像
人生短短几个秋

行动起来,活在当下

  • 累计撰写 45 篇文章
  • 累计创建 20 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

设计模式-状态模式

人生短短几个秋
2025-01-25 / 0 评论 / 0 点赞 / 14 阅读 / 0 字

设计模式 - 状态模式(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();
        }
    }
}

使用场景

状态模式适用于以下情况:

  • 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
  • 控制状态转换的条件表达式过于复杂。

总结

状态模式通过将对象的状态及其行为封装在不同的类中,使得对象可以根据其内部状态的变化改变其行为。这种方式不仅增强了代码的可维护性和可扩展性,还能清晰地表达状态转换的逻辑。


以上就是状态模式的一个实现案例,希望这篇文章能帮助你理解状态模式的使用方式及其优势。

0

评论区