C++设计模式之状态模式

这篇具有很好参考价值的文章主要介绍了C++设计模式之状态模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【声明】本题目来源于卡码网(卡码网KamaCoder)

【提示:如果不想看文字介绍,可以直接跳转到C++编码部分


【设计模式大纲】

【简介】

        --什么是状态模式(第20种设计模式)

        状态模式(State Pattern)是⼀种行为型设计模式,它适⽤于⼀个对象在不同的状态下有不同的行为时,⽐如说电灯的开、关、闪烁是不停的状态,状态不同时,对应的行为也不同,在没有状态模式的情况下,为了添加新的状态或修改现有的状态,往往需要修改已有的代码,这违背了开闭原则,而且如果对象的状态切换逻辑和各个状态的行为都在同⼀个类中实现,就可能导致该类的职责过重不符合单⼀职责原则
        而状态模式将每个状态的行为封装在⼀个具体状态类中,使得每个状态类相对独⽴,并将对象在不同状态下的行为进⾏委托,从而使得对象的状态可以在运行时动态改变,每个状态的实现也不会影响其他状态。


【基本结构】

        状态模式包括以下⼏个重要角色:

  • State (状态): 定义⼀个接口,⽤于封装与Context的⼀个特定状态相关的⾏为。
  • ConcreteState (具体状态): 负责处理Context在状态改变时的⾏为, 每⼀个具体状态⼦类实现⼀个与Context 的⼀个状态相关的⾏为。
  • Context (上下⽂): 维护⼀个具体状态⼦类的实例,这个实例定义当前的状态。

【基本实现】

1. 定义状态接口:

        创建⼀个状态接⼝,该接⼝声明了对象可能的各种状态对应的⽅法。

// 状态接⼝
public interface State {
    void handle();
}


2. 实现具体状态类:

        为对象可能的每种状态创建具体的状态类,实现状态接⼝中定义的⽅法。

// 具体状态类1
public class ConcreteState1 implements State {
    @Override
    public void handle() {
        // 执⾏在状态1下的操作
    }
}
// 具体状态类2
public class ConcreteState2 implements State {
    @Override
    public void handle() {
        // 执⾏在状态2下的操作
    }
}


3. 创建上下文类:

        该类包含对状态的引用,并在需要时调⽤当前状态的⽅法。

// 上下⽂类
public class Context {
    private State currentState;

    public void setState(State state) {
        this.currentState = state;
    }

    public void request() {
        currentState.handle();
    }
}

4. 客户端使用:

        创建具体的状态对象和上下文对象,并通过上下文对象调用相应的⽅法。通过改变状态,可以改变上下⽂对象的行为

public class Client {
    public static void main(String[] args) {
        Context context = new Context();

        State state1 = new ConcreteState1();
        State state2 = new ConcreteState2();

        context.setState(state1);
        context.request(); // 执⾏在状态1下的操作

        context.setState(state2);
        context.request(); // 执⾏在状态2下的操作
    }
}

【使用场景】

        状态模式将每个状态的实现都封装在⼀个类中,每个状态类的实现相对独⽴,使得添加新状态或修改现有状态变得更加容易,避免了使⽤⼤量的条件语句来控制对象的行为。但是如果状态过多,会导致类的数量增加,可能会使得代码结构复杂。
        总的来说,状态模式适用于有限状态机的场景,其中对象的⾏为在运⾏时可以根据内部状态的改变⽽改变,在游戏开发中,Unity3D 的 Animator 控制器就是⼀个状态机。它允许开发⼈员定义不同的状态(动画状态),并通过状态转换来实现角色的动画控制和⾏为切换。


【C++编码部分】

1. 题目描述

        小明家有一个灯泡,刚开始为关闭状态(OffState)。台灯可以接收一系列的指令,包括打开("ON")、关闭("OFF")和闪烁("BLINK")。每次接收到一个指令后,台灯会执行相应的操作,并输出当前灯泡的状态。请设计一个程序模拟这个灯泡系统。

2. 输入描述

        第一行是一个整数 n(1 <= n <= 1000),表示接收的命令数量。 接下来的 n 行,每行包含一个字符串 s,表示一个命令("ON"、"OFF"或"BLINK")。

3. 输出描述

        对于每个命令,输出一行,表示执行该命令后灯泡的状态。

4. C++编程实例

/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file StateMode.hpp
* @brief 状态模式
* @autor 写代码的小恐龙er
* @date 2024/01/24
*/

#include <iostream>
#include <string>

using namespace std;

// 前置声明

//  状态接口 类
class State;

// 具体状态1 -- 打开
class StateOn;
// 具体状态2 -- 关闭
class StateOff;
// 具体状态3 -- 闪烁
class StateBlink;

// 上下文类 -- 关注的对象类 灯
class Light;

//  状态接口 类
class State{
// 成员接口函数
public:
    virtual string Handle() = 0;
};

// 具体状态1 -- 打开
class StateOn : public State
{
// 重载接口函数
public:
    string Handle() override{
        return "Light is ON";
    }
};

// 具体状态2 -- 关闭
class StateOff : public State
{
// 重载接口函数
public:
    string Handle() override{
        return "Light is OFF";
    }
};

// 具体状态3 -- 闪烁
class StateBlink : public State
{
// 重载接口函数
public:
    string Handle() override{
        return "Light is Blinking";
    }
};

// 上下文类 -- 关注的对象类 灯
class Light{
// 成员数据
private:
    // 灯的状态
    State *_state = nullptr;
// 成员函数 
public:
    // 构造函数
    Light(){
        this->_state = new StateOff();
    }
    
    // 设置状态
    void SetState(State *state){
        this->_state = state;
    }
    
    // 执行操作
    string HandleState(){
        return _state->Handle();
    }
};

int main()
{
    // 命令数量
    int orderNum = 0;
    std::cin >> orderNum;
    // 创建 上下文类 -- 灯泡
    Light *light = new Light();
    // 创建 状态基类
    State *state = nullptr;
    // 遍历输入
    for(int i = 0; i < orderNum; i++){
        // 指令类型
        string orderType = "";
        std::cin >> orderType;
        
        // 判断
        if(orderType == "ON"){
            state = new StateOn();
        }
        else if(orderType == "OFF"){
            state = new StateOff();
        }
        else if(orderType == "BLINK"){
            state = new StateBlink();
        }
        
        // 给灯设置状态
        light->SetState(state);
        // 打印信息
        string printInfo = light->HandleState();
        std::cout << printInfo << endl;
    }
    
    // 析构!
    delete light;
    light = nullptr;
    
    if(state != nullptr){
        delete state;
        state = nullptr;
    }

    return 0;
}


......

To be continued.文章来源地址https://www.toymoban.com/news/detail-824880.html

到了这里,关于C++设计模式之状态模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java设计模式之状态模式

    基本介绍 状态模式:它主要是用来解决对象在多种状态转换时,需要对外输出不同的行为的问题,状态和行为是一一对应的,状态之间可以相互转换。 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 原理类图 说明: Context 类为环境角色,

    2024年02月20日
    浏览(41)
  • 【设计模式】用Java实现状态模式

    状态模式是一种行为设计模式,它允许对象在内部状态发生改变时改变其行为。该模式将对象的行为包装在不同的状态类中,使得对象的行为可以根据其当前状态动态改变。 状态模式通常由以下几个角色组成: 环境类(Context) :环境类是拥有状态的对象,它将会根据当前状

    2024年02月10日
    浏览(32)
  • Java设计模式之状态模式详解

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们一同探讨Java设计模式之状态模式,这是代码中的智能状态切换,能够让对象在不同状态下表现出不同的行为。 状态模式的核心思想 状态模式

    2024年01月20日
    浏览(37)
  • 【十五】设计模式~~~行为型模式~~~状态模式(Java)

    【学习难度:★★★☆☆,使用频率:★★★☆☆】 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互

    2024年02月07日
    浏览(47)
  • 【Java 设计模式】行为型之状态模式

    状态模式(State Pattern)是一种行为型设计模式,用于通过将对象的行为封装到不同的状态类中,使得对象在不同的状态下具有不同的行为。状态模式允许对象在内部状态发生改变时改变其行为,而无需修改其代码。在本文中,我们将深入研究Java中状态模式的定义、结构、使

    2024年01月24日
    浏览(48)
  • Java设计模式之行为型-状态模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不

    2024年02月16日
    浏览(39)
  • 【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    请编写程序完成APP抽奖活动具体要求如下: 假如每参加一次这个活动要扣除用户50积分,中奖概率是10% 奖品数量固定,抽完就不能抽奖 活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完,活动的四个状态转换关系图如下 一开始的状态为“不能抽奖”,当扣除50积分

    2024年02月12日
    浏览(45)
  • C++笔记之设计模式全局状态管理类:使整个工程项目中的所有函数可以访问同一个变量,并且能够感知到这个变量的变化(变量共享)

    —— 杭州 2024-03-21 夜 实现方法 : 全局变量(不介绍) 单例模式 全局状态管理类 全局状态管理类+单例模式 静态变量或静态成员(不介绍) code review!

    2024年03月22日
    浏览(61)
  • 设计模式:状态模式示例

    状态模式可以应用于多种场景,下面是一些示例及其代码实现: 1. 交通信号灯 交通信号灯(红灯、绿灯、黄灯)根据当前状态切换到下一个状态。 2. 游戏角色等级系统 游戏中的角色根据经验值提升等级,不同等级有不同的行为。 这两个示例展示了状态模式在不同场景下的

    2024年04月23日
    浏览(29)
  • 设计模式-状态模式

    一个对象有状态变化 每次状态变化都会触发一个逻辑 不能总是用 if else 来控制 交通信号灯不同颜色的变化 传统UML类图 简化后的UML类图 有限个状态、以及在这些状态之间的变化 如交通信号灯 使用开源lib:javascript-state-machine github.com/jakesgordon/javascript-state-machine 有限状态机

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包