设计模式之状态模式

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)

posted @ 2024-01-18 02:54  当时明月在曾照彩云归  阅读(7)  评论(0编辑  收藏  举报