行为模式---状态模式

打印 上一主题 下一主题

主题 947|帖子 947|积分 2843

概念

状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态的改变而改变,使其看上去就像是类的一个属性一样。
适用场景

1、假如对象必要根据不同的状态进行不同的利用的,且状态较多而且代码必要复用的时,必要使用到状态模式。
2、假如某个类必要根据成员的状态改变自身的行为且必要大量的条件判定语句的时,可以使用该模式。
3、当相似的状态和基于条件的状态机转换中存在许多重复代码的时候,可以使用状态模式。
创建方式

1、使用状态模式的时候必要起首创建一个状态类、上下文类。
2、创建一个状态类接口对象,在这个接口对象中必要创建一个上下文指针对象,并创建一个设置上下文的接口和所有的状态利用函数。
3、创建现实的状态类对象,在现实的状态类对象实现具体的利用函数方法,在此方法中实现状态的切换。
4、实现上下文类,在上下文状态类中实现状态类的指针对象引用,并实现一个切换函数在此函数中将当前状态设置给当前上下文。然后实现上下文的利用函数。在上下文的利用函数中通过状态引用对象调用状态的利用函数。
5、在客户端的使用的时候,起首创建一个初始转台对象,之后创建一个上下文对象,并将状态对象设置个上下文,之后通过调用上下文中的利用函数进行状态切换和状态的利用函数。
类关系图


示例代码

  1. #include "ZhuangTaiMoShi.h"
  2. int main()
  3. {
  4.     std::cout << "欢迎东哥来到设计模式的世界!\n";
  5.     //创建状态
  6.     StateBase* state1 = new State1();
  7.     StateBase* state2 = new State2();
  8.     //创建上下文对戏
  9.     Context* context = new Context();
  10.     context->switchState(state1);
  11.     context->deputeHandle1();
  12.     context->deputeHandle2();
  13.     context->switchState(state2);
  14.     context->deputeHandle1();
  15.     context->deputeHandle2();
  16. }
复制代码
  1. #pragma once
  2. #include <string>
  3. #include <iostream>
  4. using namespace std;
  5. class Context;
  6. //状态接口类
  7. class StateBase
  8. {
  9. public:
  10.         StateBase() {}
  11.         ~StateBase() {}
  12.         virtual void handle1() {}
  13.         virtual void handle2() {}
  14. };
  15. //具体状态接口类
  16. class State1 : public StateBase {
  17. public:
  18.         State1() {}
  19.         ~State1() {}
  20.         void handle1() {
  21.                 cout << "状态1操作函数1:第一队右侧迂回" << endl;
  22.         }
  23.         void handle2() {
  24.                 cout << "状态1操作函数2:第而队左侧突击" << endl;
  25.         }
  26. };
  27. class State2 : public StateBase {
  28. public:
  29.         State2() {}
  30.         ~State2() {}
  31.         void handle1() {
  32.                 cout << "状态2操作函数1:先锋队冲锋" << endl;
  33.         }
  34.         void handle2() {
  35.                 cout << "状态2操作函数2:狙击手掩护" << endl;
  36.         }
  37. };
  38. //上下文对象类
  39. class Context {
  40. public:
  41.         Context() {}
  42.         ~Context() {}
  43.         void switchState(StateBase* state) {
  44.                 m_state = state;
  45.         }
  46.         void deputeHandle1() {
  47.                 m_state->handle1();
  48.         }
  49.         void deputeHandle2() {
  50.                 m_state->handle2();
  51.         }
  52. private:
  53.         StateBase* m_state = nullptr;
  54. };
复制代码
  1. 欢迎东哥来到设计模式的世界!
  2. 状态1操作函数1:第一队右侧迂回
  3. 状态1操作函数2:第而队左侧突击
  4. 状态2操作函数1:先锋队冲锋
  5. 状态2操作函数2:狙击手掩护
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

祗疼妳一个

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表