从JDK中学习设计模式——状态模式

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

概述

状态模式(State Pattern)是当一个对象的内部状态改变时,允许其行为的改变,这个对象的类看起来像被修改了。因此又称为状态对象(Objects for States)模式,是一种对象行为型模式。

状态模式主要用来解决系统中的两种问题,其一是复杂对象状态的转换,另一种是对象在不同状态下的行为的封装。当系统中的某个对象存在多种状态,并且这些状态之间可以进行转换,而对象在不同的状态下行为不同,此时就可以使用状态模式。

状态模式将一个对象的状态从该对象中抽离出来,将其封装到专门的状态类中,使对象的状态可以灵活的变化。对于客户端而言,无须关心对象状态的转换以及对象当前所处的状态,无论对于何种状态的对象,客户端都可以一致处理。

结构

状态模式UML.png

  • Context(环境类):又称为上下文类,它是拥有多种状态的对象
  • State(抽象状态类):一般为接口或抽象类,定义了环境类的一个特定状态的行为
  • ConcreteState(具体状态类):每一个具体状态类实现环境类的一个特定状态的行为

优点

  1. 将对象的行为与状态解耦,降低了系统的复杂度,提高了系统的可维护性,符合单一职责原则
  2. 增加对象的行为不必修改客户端的代码,符合开闭原则
  3. 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
  4. 对象状态的变换放到了内部,客户端不必知道类的内部是如何实现状态和行为的切换的,符合迪米特法则

缺点

  1. 状态过多,会造成类膨胀,不利于维护。
  2. 会增加系统中类和对象的个数,导致系统运行开销增大。
  3. 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
  4. 增加新的状态类时,需要修改负责状态转换的源代码,不符合开闭原则。

应用场景

  1. 行为会随着状态的改变而改变。
  2. 当程序中需要使用大量的条件、分支判断语句时,可以考虑使用状态模式。

JDK 中的应用

在 JDK 中 java.util.Iterator 就使用了状态模式。

Guess you like

Origin juejin.im/post/7034538290933923876