程序设计的状态模式及其使用场景

Posted Qianliwind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序设计的状态模式及其使用场景相关的知识,希望对你有一定的参考价值。

状态模式的使用场景:
一个由一个或多个动态变化的属性导致发生不同行为的对象,在与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化,那么这个对象,就是有状态的对象
代码中包含大量与对象状态有关的条件语句,像是if else或switch case语句,且这些条件执行与否依赖于该对象的状态。
如果场景符合上面两个条件,那我们就可以想象状态模式是不是可以帮忙了

状态模式的优缺点:
优点:

一个状态状态对应行为,封装在一个类里,更直观清晰,增改方便
状态与状态间,行为与行为间彼此独立互不干扰
避免事物对象本身不断膨胀,条件判断语句过多
每次执行动作不用走很多不必要的判断语句,用哪个拿哪个
缺点:

需要将事物的不同状态以及对应的行为拆分出来,有时候会无法避免的拆分的很细,有的时候涉及业务逻辑,一个动作拆分出对应的两个状态,动作就拆不明白了,过度设计
必然会增加事物类和动作类的个数,有时候动作类再根据单一原则,按照功能拆成几个类,会反而使得代码混乱,可读性降低
状态模式场景实例
组件开发中的状态模式——导航

我们平时开发组件时很多时候要切换组件的状态,每种状态有不同的处理方式,这个时候就可以使用状态模式进行开发。

用和上面一样的思路,我们来举一个React组件的小例子,比如一个Banner导航,最基本的两种状态,显示和隐藏,如下:

const States = {
  "show": function () {
    console.log("banner展现状态,点击关闭");
    this.setState({
      currentState: "hide"
    })
  },
  "hide": function () {
    console.log("banner关闭状态,点击展现");
    this.setState({
      currentState: "show"
    })
  }
};



同样通过一个对象States来定义banner的状态,这里有两种状态show和hide,分别拥有相应的处理方法,调用后再分别把当前banner改写为另外一种状态。接下来来看导航类Banner:

class Banner extends Component{
  constructor(props) {
    super(props);
    this.state = {
      currentState: "hide"
    }
    this.toggle = this.toggle.bind(this);
  }
  toggle () {
    const s = this.state.currentState;
    States[s] && States[s].apply(this);
  }

  render() {
    const { currentState } = this.state;
    return (
      <div className="banner" onClick={this.toggle}>
      </div>
    );
  }
};

export default Banner;


这个导航类有一个toggle方法用来切换状态,然后调用相应的处理方法。

如果有第三种状态,我们只需要States添加相应的状态和处理程序即可。

以上是关于程序设计的状态模式及其使用场景的主要内容,如果未能解决你的问题,请参考以下文章

23种设计模式及其应用场景

23种设计模式及其应用场景

java模式及其应用场景

尝试使用片段保存夜间模式状态

设计模式状态模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

“反应堆模式”及其应用的简单解释[关闭]