Java设计模式行为型模式(16)--- 状态模式

文章介绍了如何使用状态模式来改进电梯控制系统的代码,原始代码中大量使用了switch...case语句,降低了可读性和可扩展性。状态模式通过将每个状态的行为封装到单独的类中,提高了代码的结构和可维护性。文章展示了如何创建抽象状态类和具体状态类(如OpeningState,ClosingState等),以及环境类(Context)来管理当前状态并执行相应操作。状态模式使得添加新状态变得更加容易,同时也简化了状态转换的逻辑。然而,该模式可能会增加系统类的数量,且实现复杂,需要谨慎使用。适用场景包括对象行为取决于其状态的情况,或者需要根据状态改变行为的复杂条件分支结构。

前言
想要了解更多文档知识,请点击 昂焱数据(www.ayshuju.com

状态模式

1.1、概述

【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。

类图如下:

在这里插入图片描述

1.1.1、代码如下

1.1.1.1、ILift
/**
 * @version v1.0
 * @ClassName: ILift
 * @Description: 电梯接口
 */
public interface ILift {
   
   

    //定义四个电梯状态的常量
    int OPENING_STATE = 1;
    int CLOSING_STATE = 2;
    int RUNNING_STATE = 3;
    int STOPPING_STATE = 4;

    //设置电梯状态的功能
    void setState(int state);

    //电梯操作功能
    void open();

    void close();

    void run();

    void stop();
}
1.1.1.2、Lift
/**
 * @version v1.0
 * @ClassName: Lift
 * @Description: 电梯类(ILift的子实现类)
 */
public class Lift implements ILift {
   
   

    //声明一个记录当前电梯的状态
    private int state;

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

    public void open() {
   
   
        switch (state) {
   
    //当前电梯状态
            case OPENING_STATE :
                //什么事都不做
                break;
            case CLOSING_STATE :
                System.out.println("电梯打开了...");
                //设置当前电梯状态为开启状态
                setState(OPENING_STATE);
                break;
            case STOPPING_STATE :
                System.out.println("电梯打开了...");
                //设置当前电梯状态为开启状态
                setState(OPENING_STATE);
                break;
            case RUNNING_STATE :
                //什么事都不做
                break;
        }
    }

    public void close() {
   
   
        switch (this.state) {
   
   
            case OPENING_STATE:
                System.out.println("电梯关门了。。。");//只有开门状态可以关闭电梯门,可以对应电梯状态表来看
                this.setState(CLOSING_STATE);//关门之后电梯就是关闭状态了
                break;
            case CLOSING_STATE:
                //do nothing //已经是关门状态,不能关门
                break;
            case RUNNING_STATE:
                //do nothing //运行时电梯门是关着的,不能关门
                break;
            case STOPPING_STATE:
                //do nothing //停止时电梯也是关着的,不能关门
                break;
        }
    }

    public void run() {
   
   
        switch (this
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值