设计模式之状态模式
1. 定义
对象在内部状态发生改变时改变其行为
2. 口语化表述
状态模式,其实就是希望某个对象、某个物体在不同的情况下会做合适的事情
比如,播放视频
对于一个空格键(通常用于控制视频播放),假设视频正在播放中,此时按下空格键,视频应当暂停
假设视频正在暂停状态,此时按下空格键,视频应当播放
你看,同样是空格键,在视频的不同状态下,具有不同的功能,这就是状态模式
(下面的描述会沿用这个上述这个场景)
3. 源码示例
FacesServlet是JavaServer Faces (JSF)框架中的一个核心组件,它是一个Servlet,用于处理和管理JSF应用程序的请求和生命周期。JSF是一个用于构建用户界面的Java框架,它提供了一种组件化的方式来构建Web应用程序的用户界面
FacesServlet负责接收HTTP请求并将其转发给JSF应用程序的其他组件进行处理,比如处理用户输入、渲染页面等,它还管理JSF应用程序的生命周期,包括初始化、处理请求、执行事件处理器、渲染响应等
在JavaServer Faces (JSF)框架中,虽然FacesServlet本身并没有直接使用状态模式,但是JSF框架本身在处理用户界面的状态管理时,使用了类似状态模式的思想
在JSF框架中,每个用户界面组件都有自己的状态,比如可见性、禁用状态、值等等。这些状态可以根据用户的操作或者其他条件而发生变化。JSF框架通过内部的状态管理机制来处理这些状态的变化,并在界面渲染时根据当前状态来呈现不同的界面
虽然这种状态管理机制不是严格意义上的状态模式,但它使用了类似的思想:将对象的行为封装在不同的状态中,并根据对象的内部状态来改变行为。这使得开发者能够更容易地管理和控制用户界面组件的状态,而不需要手动处理每一个状态变化的情况
因此,虽然FacesServlet本身并没有直接使用状态模式,但是JSF框架在处理用户界面状态管理时使用了类似状态模式的思想,从而简化了界面状态的管理和控制
4. 总结
4.1 设计优点
-
单一职责原则
将与特定状态相关的代码放在单独的类中
-
开闭原则
无需修改已有状态类和上下文就能引入新状态
4.2 适用场景
-
对象需要根据自身当前状态进行不同行为
上述视频播放例子中,同样是空格键,不同的状态下有不同的行为
(其实这一点类似于抽象基类与具体类的关系,比如抽象基类为空格键按下,具体类为播放时按下与暂停时按下)
5. 参考资料
[1] 状态设计模式 (refactoringguru.cn)
[2] FacesServlet (Java(TM) EE 7 Specification APIs) (oracle.com)