Linux C++ 055-设计模式之状态模式
创始人
2024-12-28 15:05:18
0

Linux C++ 055-设计模式之状态模式

本节关键字:Linux、C++、设计模式、状态模式
相关库函数:

概念

状态模式(State Pattern)是设计模式的一种,属于行为模式。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

状态模式解决对象行为依赖于其状态的问题,使得对象可以在状态变化时切换行为。

优缺点

优点

1、封装状态转换规则:将状态转换逻辑封装在状态对象内部。
2、易于扩展:增加新的状态类不会影响现有代码。
3、集中状态相关行为:将所有与特定状态相关的行为集中到一个类中。
4、简化条件语句:避免使用大量的条件语句来切换行为。
5、状态共享:允许多个上下文对象共享同一个状态对象。

缺点

1、增加类和对象数量:每个状态都需要一个具体的状态类。
2、实现复杂:模式结构和实现相对复杂。
3、开闭原则支持不足:增加新状态或修改状态行为可能需要修改现有代码。

使用场景

1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2、一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

当对象的行为随状态改变而变化时,考虑使用状态模式。状态模式适用于替代复杂的条件或分支语句。

角色说明

状态模式包含以下几个主要角色:

上下文(Context):定义了客户感兴趣的接口,并维护一个当前状态对象的引用。上下文可以通过状态对象来委托处理状态相关的行为。

状态(State):定义了一个接口,用于封装与上下文相关的一个状态的行为。

具体状态(Concrete State):实现了状态接口,负责处理与该状态相关的行为。具体状态对象通常会在内部维护一个对上下文对象的引用,以便根据不同的条件切换到不同的状态。

代码示例

//头文件 #include  using namespace std;  class Context; // 抽象出来的状态类 class State { public:     /* 抽象的接口,每个子类去实现这个接口        根据自己的逻辑执行任务或者转换状态。     */     virtual void Handle(Context *context) = 0;     // 获得当前的状态     virtual void GetState() = 0; };  // 状态管理类 class Context { public:     // 初始化状态     Context(State *state) {         m_pState = state;     }     // 获得当前的状态     State* GetState() {         return m_pState;     }     // 改变当前的状态     void SetState(State *state)     {         m_pState = state;     }     // 执行状态类实现的方法     void Request() {         m_pState->Handle(this);     }     State* m_pState; }; // 具体的状态子类 class ConcreteStateA:public State { public:     void Handle(Context *context);     void GetState(); }; // 具体的状态子类 class ConcreteStateB:public State { public:     void Handle(Context *context);     void GetState(); }; // 具体的状态子类 class ConcreteStateC:public State { public:     void Handle(Context *context);     void GetState(); };  // cpp文件 #include "StateMode.h" void ConcreteStateA:: Handle(Context *context) {     context->m_pState = new ConcreteStateB;     cout<<"当前状态是A,下一状态是B"<     context->m_pState = new ConcreteStateC;     cout<<"当前状态是B,下一状态是C"<     context->m_pState = new ConcreteStateA;     cout<<"当前状态是C,下一状态是A"<     cout<<"当前状态是A"<     cout<<"当前状态是B"<     cout<<"当前状态是B"<     // 初始化A状态     Context* context = new Context(new ConcreteStateA);     context->Request();     context->Request();     context->Request();     getchar();     return 0; } 

相关内容

热门资讯

绝活儿辅助!广西老友玩老是输怎... 绝活儿辅助!广西老友玩老是输怎么办(辅助挂)都是真的有辅助app(讲解有挂)在进入广西老友玩老是输怎...
法门辅助!福建13水插件(辅助... 法门辅助!福建13水插件(辅助挂)一贯是有辅助技巧(有挂技术)1、许多玩家不知道福建13水插件辅助怎...
办法辅助!潮友会app下载官方... 办法辅助!潮友会app下载官方辅助器(辅助挂)真是真的是有辅助app(有挂教程)该软件可以轻松地帮助...
妙招辅助!邯郸胡乐挂辅助(辅助... 妙招辅助!邯郸胡乐挂辅助(辅助挂)好像存在有辅助插件(有挂方略)1、上手简单,内置详细流程视频教学,...
教程书辅助!乐酷辅助(辅助挂)... 教程书辅助!乐酷辅助(辅助挂)其实存在有辅助脚本(有挂细节)乐酷辅助能透视中分为三种模型:乐酷辅助模...
学习辅助!决战卡五星辅助(辅助... 学习辅助!决战卡五星辅助(辅助挂)本来真的是有辅助软件(有人有挂)学习辅助!决战卡五星辅助(辅助挂)...
绝活辅助!边锋嘉兴麻将辅助器(... 绝活辅助!边锋嘉兴麻将辅助器(辅助挂)真是真的有辅助神器(新版有挂)1、边锋嘉兴麻将辅助器公共底牌简...
举措辅助!枫叶辅助器(辅助挂)... 举措辅助!枫叶辅助器(辅助挂)本来存在有辅助技巧(竟然有挂)1、下载好枫叶辅助器正确养号方法之后点击...
讲义辅助!点我达辅助(辅助挂)... 讲义辅助!点我达辅助(辅助挂)一直存在有辅助技巧(有人有挂)1、点我达辅助辅助器安装包、点我达辅助辅...
模块辅助!威信茶馆有挂的吗(辅... 模块辅助!威信茶馆有挂的吗(辅助挂)一直真的是有辅助脚本(揭秘有挂)1、玩家可以在威信茶馆有挂的吗线...