津津乐道设计模式 - 状态模式详解(以交通信号灯举例带你快速理解)

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

什么是状态模式

状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为。状态模式将对象的行为封装在不同的状态类中,并通过上下文对象来管理状态的切换。
在这里插入图片描述

在状态模式中,有以下几个关键角色:

上下文(Context):维护一个对当前状态对象的引用,并提供接口给客户端来请求状态的改变。

抽象状态(State):定义一个通用的状态接口,具体的状态类实现这个接口,并根据具体的状态来实现相应的行为。

具体状态(Concrete State):实现抽象状态接口,定义该状态下的具体行为。

状态模式的核心思想是将对象的行为和状态解耦,使得对象的行为可以根据内部状态的变化而变化,同时遵循开闭原则,易于扩展。

状态模式适用场景

  • 当一个对象的行为取决于其内部状态,并且在运行时需要根据状态来改变行为时,可以使用状态模式 (比如:订单状态)

  • 当对象的行为有多个状态且频繁发生变化时,可以使用状态模式来减少大量的条件判断语句 (比如:商品库存状态)

  • 当需要在运行时动态地添加新的状态,并且能够轻松地扩展状态类时,可以使用状态模式

  • 当对象具有较复杂的状态转换逻辑时,可以使用状态模式来简化状态之间的转换关系

状态模式通过将对象的行为和状态进行分离,使得状态的变化可以独立于行为,从而提高了代码的可维护性和扩展性。它适用于对象具有多个状态且需要根据不同状态来改变行为的场景。

生活案例

在一个交通信号灯系统中,交通信号灯可以处于不同的状态,比如红灯、绿灯和黄灯。每个状态下交通信号灯的行为和显示都是不同的,我们可以使用状态模式来实现这个场景,让大家更容易理解状态模式;
在这里插入图片描述

案例代码

首先,我们定义一个状态接口(State),其中包含了交通信号灯的行为方法,比如显示信号灯、处理信号灯变化等:

// 状态接口
public interface State {
    void displaySignal();
    void handleSignalChange(TrafficSignal signal);
}

我们定义交通信号灯类(TrafficSignal)作为上下文,包含当前的状态对象,并提供了一些方法来控制信号灯的行为:

// 交通信号灯类
public class TrafficSignal {
    private State state;

    public TrafficSignal() {
        // 初始状态为红灯
        this.state = new RedLightState();
    }

    public void setState(State state) {
        this.state = state;
    }

    public void displaySignal() {
        state.displaySignal();
    }

    public void changeSignal() {
        state.handleSignalChange(this);
    }
}

然后,我们定义具体的状态类,分别表示红灯、绿灯和黄灯:

// 红灯状态
public class RedLightState implements State {
    @Override
    public void displaySignal() {
        System.out.println("红灯亮起");
    }

    @Override
    public void handleSignalChange(TrafficSignal signal) {
        signal.setState(new GreenLightState());
    }
}

// 绿灯状态
public class GreenLightState implements State {
    @Override
    public void displaySignal() {
        System.out.println("绿灯亮起");
    }

    @Override
    public void handleSignalChange(TrafficSignal signal) {
        signal.setState(new YellowLightState());
    }
}

// 黄灯状态
public class YellowLightState implements State {
    @Override
    public void displaySignal() {
        System.out.println("黄灯亮起");
    }

    @Override
    public void handleSignalChange(TrafficSignal signal) {
        signal.setState(new RedLightState());
    }
}

现在,我们可以在客户端中使用交通信号灯系统:

public class Client {
    public static void main(String[] args) {
        TrafficSignal signal = new TrafficSignal();

        // 显示当前信号灯状态
        signal.displaySignal();

        // 切换信号灯状态
        signal.changeSignal();

        // 显示切换后的信号灯状态
        signal.displaySignal();
    }
}

最终代码结构如下:
在这里插入图片描述
执行效果:

在这里插入图片描述

在上述代码中,我们通过创建交通信号灯对象并调用相应的方法来控制交通信号灯的行为。通过改变状态对象,交通信号灯的行为和显示也随之改变。

通过使用状态模式,我们可以实现交通信号灯系统的灵活状态转换,将每个状态的行为和显示进行了封装,使得代码结构清晰、易于维护和扩展。

状态模式优缺点

状态模式的优点:

  • 简化了条件语句:状态模式能够将复杂的条件判断逻辑封装在状态类中,使得代码结构更清晰,易于理解和维护。

  • 提高了扩展性:当需要添加新的状态时,只需要创建新的状态类并实现状态接口,而不需要修改现有的代码。状态模式符合开闭原则,使得系统的可扩展性更好。

  • 将状态局部化:状态模式将对象的状态局部化,使得每个状态都有自己的方法,可以更好地控制和管理对象的状态。

  • 提高了代码可读性:状态模式使得状态和行为关联紧密,可以更清晰地表达对象的行为和状态转换逻辑,提高了代码的可读性。

状态模式的缺点:

  • 增加了类的数量:引入状态模式会增加多个状态类,可能会使得类的数量增多,增加了系统的复杂性。

  • 状态转换逻辑复杂:如果状态之间的转换逻辑比较复杂,可能会增加状态模式的实现难度。

  • 不适合状态较少或状态稳定的情况:如果对象的状态较少或者状态变化较少,使用状态模式可能会显得过于繁琐。

状态模式适用于具有多个状态且状态转换逻辑较复杂的场景,能够很好地解决对象的状态管理和状态转换问题。在使用时需要权衡其优点和缺点,并根据具体场景来选择是否使用状态模式。

结语

本章节主要介绍了状态模式、状态模式适用场景、状态模式的优缺点,并以交通信号灯举例模仿状态模式的使用方法,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micro麦可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值