[学习][笔记]设计模式(基于C/C++实现)<九>状态模式

简介: [学习][笔记]设计模式(基于C/C++实现)<九>状态模式

状态模式

状态模式|菜鸟教程

【游戏设计模式】之三 状态模式、有限状态机 & Unity版本实现

定义

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

使用场景

1.游戏

2.基于状态改变作出不同动作的场景

基本思路

1.为状态定义一个接口

2.为每个状态定义一个类

3.恰当地进行状态委托。

实例

假如有一款游戏, 一个女英雄他有多种状态, 如站立、下蹲、跳跃、下斩等状态,按照常规的实现方式,我们可以用大量的if else来判断,或者switch case来实现, 但是这样做缺点很明显, 会存在大量bug并且代码不移维护和扩展。

1.为状态定义一个接口:

class Heroine;
class HeroineState
{
public:
  virtual ~HeroineState() {}
  virtual void handleInput(Heroine& heroine, int input) = 0;
  virtual void update(Heroine& heroine) = 0;
};

2.为每个状态定义一个类

#pragma once
#include "HeroineState.h"
class JumpingState :
    public HeroineState
{
    // 通过 HeroineState 继承
    virtual void handleInput(Heroine& heroine, int input) override;
    virtual void update(Heroine& heroine) override;
};
void JumpingState::handleInput(Heroine& heroine, int input)
{
  if (input == 2) {
    printf("jumping state \n");
  }
}
void JumpingState::update(Heroine& heroine)
{
}
#pragma once
#include "HeroineState.h"
class StandState :public HeroineState
{
public:
  // 通过 HeroineState 继承
  virtual void handleInput(Heroine& heroine, int input) override;
  virtual void update(Heroine& heroine) override;
};
#include "StandState.h"
#include <stdio.h>
void StandState::handleInput(Heroine& heroine, int input)
{
  if (input == 1) {
    printf("stand state \n");
  }
}
void StandState::update(Heroine& heroine)
{
}

3.适当的进行状态委托

#pragma once
#include "HeroineState.h"
class Heroine
{
public:
  enum class StateCode {
    Stand = 1,
    Jump  = 2,
  };
  void setState(HeroineState* state) {
    this->state = state;
  }
  virtual void handleInput(int input) {
    if (state != nullptr) {
      state->handleInput(*this, input);
    }
  }
  virtual void update()
  {
    state->update(*this);
  }
private:
  HeroineState* state = nullptr;
};

main

#include <stdio.h>
#include "Heroine.h"
#include "StandState.h"
#include "JumpingState.h"
#include <stdlib.h>
void main() {
  Heroine* heroinePtr = new Heroine;
  heroinePtr->setState(new StandState());
  heroinePtr->handleInput(static_cast<int>(Heroine::StateCode::Stand));
  heroinePtr->setState(new JumpingState());
  heroinePtr->handleInput(static_cast<int>(Heroine::StateCode::Jump));
  system("pause");
}

之后就只需要继承state类 重写方法即可

总结

demo地址


相关文章
|
8天前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
75 0
|
22天前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
85 1
|
6月前
|
设计模式 网络协议 Java
【设计模式】【行为型模式】状态模式(State)
一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
243 16
|
9月前
|
设计模式 Java Go
【再谈设计模式】状态模式~对象行为的状态驱动者
状态模式属于行为型设计模式。它将对象的行为封装在不同的状态类中,使得对象在不同的状态下表现出不同的行为。上下文(Context):这是一个包含状态对象的类,它定义了客户感兴趣的接口,并维护一个具体状态对象的引用。上下文将操作委托给当前的状态对象来处理。抽象状态(State):这是一个抽象类或者接口,它定义了一个特定状态下的行为接口。所有具体的状态类都实现这个接口。具体状态(Concrete State):这些是实现抽象状态接口的类,每个具体状态类实现了与该状态相关的行为。
242 18
|
11月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
237 4
2023/11/10学习记录-C/C++对称分组加密DES
|
10月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
144 16
|
11月前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
120 2
|
11月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
125 2
|
12月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
112 2
|
12月前
|
设计模式 Java API
Kotlin教程笔记(50) - 改良设计模式 - 工厂模式
Kotlin教程笔记(50) - 改良设计模式 - 工厂模式
101 2
下一篇
开通oss服务