博客
关于我
设计模式之状态模式
阅读量:371 次
发布时间:2019-03-04

本文共 2237 字,大约阅读时间需要 7 分钟。

状态模式 (State Pattern)

概念

状态模式 (State Pattern) 是一种行为设计模式,允许通过改变对象的内部状态来改变其行为,使得对象的行为表现得像修改了其类似的效果。这种模式主要用于处理对象行为依赖于其当前状态的场景,特别是当状态判断逻辑过于复杂时。

模式选择

状态模式通过将状态相关的行为分解到不同的状态类中,从而简化了状态判断逻辑。这使得状态转换的条件表达式更加清晰,便于管理和维护。

角色和职责

  • Context(上下文):通常是一个拥有当前状态的对象,负责创建和切换相应的状态对象。

  • State(状态接口):一个接口或基类,定义了对象在不同状态下的行为。

  • ConcreteState(具体状态类):实现State接口的具体类,描述了某一特定状态下对象的行为逻辑。

适用场景

  • 当一个对象的行为依赖于其所处的状态时。
  • 当状态转换的条件表达式较为复杂时。
  • 当需要通过状态来改变对象行为时。

案例

C++ 实现示例

// 状态模式示例#include 
#include
using namespace std;class Worker;class State {public: virtual void doSomeThing(Worker* w) = 0;};class Worker {public: Worker() { m_currState = new State1; } int getHour() { return m_hour; } void setHour(int hour) { m_hour = hour; } State* getCurrentState() { return m_currState; } void setCurrentState(State* state) { m_currState = state; } void doSomeThing() { m_currState->doSomeThing(this); } private: int m_hour; State* m_currState;};class State1 : public State {public: void doSomeThing(Worker* w) { if (w->getHour() == 7 || w->getHour() == 8) { cout << "吃早饭" << endl; } else { // 状态1不满足条件,切换到状态2 w->setCurrentState(new State2); w->getCurrentState()->doSomeThing(w); } }};class State2 : public State {public: void doSomeThing(Worker* w) { if (w->getHour() == 9 || w->getHour() == 10) { cout << "工作" << endl; } else { // 状态2不满足条件,切换到状态1 w->setCurrentState(new State1); cout << "当前时间点:" << w->getHour() << "未知状态" << endl; } }};int main() { Worker* w1 = new Worker; w1->setHour(7); w1->doSomeThing(); w1->setHour(9); w1->doSomeThing(); delete w1; cout << "hello..." << endl; return 0;}

解释

  • State接口:定义了一个纯虚函数 doSomeThing,用于描述在某个状态下的行为逻辑。

  • Worker类

    • 拥有一个当前状态 m_currState
    • 提供了设置和获取当前小时数的方法。
    • 实现了切换状态的方法 setCurrentState 和执行状态行为的方法 doSomeThing
  • 具体状态类

    • State1State2 分别实现了 State 接口中的 doSomeThing 方法。
    • 根据当前小时数判断状态并切换到相应的状态类,执行相应的行为。
  • 主函数

    • 创建一个 Worker 实例,并设置其当前小时数为7。
    • 调用 doSomeThing,输出“吃早饭”。
    • 更改小时数为9,重新调用 doSomeThing,输出“工作”。
    • 最后释放资源并输出“hello...”。
  • 这种设计模式通过将状态相关的行为封装到不同的状态类中,简化了状态判断逻辑,使代码更加模块化和易于维护。

    转载地址:http://eaur.baihongyu.com/

    你可能感兴趣的文章
    Nginx配置——不记录指定文件类型日志
    查看>>
    nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    nginx配置全解
    查看>>
    Nginx配置参数中文说明
    查看>>
    nginx配置域名和ip同时访问、开放多端口
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nginx配置文件nginx.conf中文详解(总结)
    查看>>
    Nginx配置负载均衡到后台网关集群
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>