状态模式案例分析

本文介绍了一个使用状态模式解决UI交互问题的具体案例。通过定义不同状态的对象来处理对象生命周期中的各种事件,使得代码更加清晰和易于维护。展示了如何根据不同状态改变按钮的行为,并提供了未使用状态模式与使用状态模式的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

初始状态下,【暂停按钮】不可点,所有数轴可调:

这里写图片描述

点击【动态波】后,【暂停按钮】可点,所有数轴可调:

这里写图片描述

点击【暂停按钮】后,“暂停”变为“播放”,所有数轴不可调:

这里写图片描述

分析需求

上面的需求很明显可以分为三个状态:初始状态、波动状态、暂停状态。不同的状态下,同一个按钮的表现不一样,比如暂停按钮,在初始状态下不可点,在其它状态下可点。

其实判断是否使用状态模式也是这样考虑:看同一个对象,在整个生命周期中,对同一个事件是否有多种响应。如果有的话,那这个对象就存在多个状态。如果多个对象都有某几个状态(比如都有播放,暂停状态),那就可以考虑使用状态模式了。

使用状态模式的好处是,可以消除分散各处的状态判断的代码。

实现代码

  • 不使用状态模式:
class DomEvent{

   stop(e){
     if(this.state === 'waving'){
        //处理波动状态
     }else if(this.state === 'stop'){
        //处理暂停状态
     }else{
       //处理初始状态
     }
   }

   /**
     * 点击波长数轴
     */
    clickWave(e){
        if(this.state === 'stop'){
            return;
        }
        //...
    }
}
  • 使用状态模式
export default class DomEvent{
    //单例
    static _inst;
    static getInst(){
        DomEvent._inst = DomEvent._inst || new DomEvent();
        return DomEvent._inst;
    }

    constructor(){}

    init(){
        this.stateList = {
            "default" : new DefaultState(),
            "waving" : new WavingState(),
            "stop" : new StopState()
        }
        this.state = this.stateList["default"];
        return this;
    }

    /**
     * 修改状态
     */
    changeState(stateName){
        this.state = this.stateList[stateName];
    }

    stop(e){
        this.state.stop(e);
    }

    /**
     * 点击波长数轴
     */
    clickWave(e){
        this.state.clickWave(e);
    }
}

具体的状态类可以这样写:

export default class StopState{
    constructor(){
        this.domEvents = DomEvent.getInst();
    }

    stop(e){
        this.stopBtn.text("播放");
        this.domEvents.changeState('waving');
    }

    /**
     * 点击波长数轴
     */
    clickWave(e){
        //...
    }
}

这样,每个状态下该做什么,一目了然。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值