首页 > 其他分享 >行为型模式-状态模式

行为型模式-状态模式

时间:2023-11-14 21:45:00浏览次数:26  
标签:状态 vendingMachine void 模式 pressButton 行为 售货机

1 什么是状态模式

状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态改变时改变它的行为。状态模式通过将对象的状态封装成独立的类,使得对象在不同状态下可以有不同的行为,同时使状态转换更加简洁和可控。

在状态模式中,包括以下几个核心角色:

  • Context(上下文):定义客户感兴趣的接口,维护一个当前状态对象,并将与状态相关的请求委托给当前状态对象处理。
  • State(状态):定义一个接口,封装与Context的一个特定状态相关的行为。
  • ConcreteState(具体状态):每一个具体状态类实现State接口,负责该状态下的具体行为。

2 举个例子

下面以一个自动售货机的例子来说明状态模式。

#include <iostream>

// 售货机状态接口
class VendingMachineState {
public:
    virtual void insertCoin() = 0;
    virtual void pressButton() = 0;
    virtual void dispenseItem() = 0;
    virtual void returnCoin() = 0;
};

// 具体状态类:无硬币
class NoCoinState : public VendingMachineState {
public:
    void insertCoin() override {
        std::cout << "Coin inserted" << std::endl;
    }

    void pressButton() override {
        std::cout << "Please insert a coin" << std::endl;
    }

    void dispenseItem() override {
        std::cout << "Please insert a coin" << std::endl;
    }

    void returnCoin() override {
        std::cout << "No coin to return" << std::endl;
    }
};

// 具体状态类:有硬币
class HasCoinState : public VendingMachineState {
public:
    void insertCoin() override {
        std::cout << "Coin already inserted" << std::endl;
    }

    void pressButton() override {
        std::cout << "Item dispensed" << std::endl;
    }

    void dispenseItem() override {
        std::cout << "Please press the button" << std::endl;
    }

    void returnCoin() override {
        std::cout << "Coin returned" << std::endl;
    }
};

// 上下文类:自动售货机
class VendingMachine {
private:
    VendingMachineState* state;

public:
    VendingMachine() {
        state = new NoCoinState();
    }

    void setState(VendingMachineState* newState) {
        delete state;  // 释放原来的状态对象
        state = newState;
    }

    void insertCoin() {
        state->insertCoin();
    }

    void pressButton() {
        state->pressButton();
    }

    void dispenseItem() {
        state->dispenseItem();
    }

    void returnCoin() {
        state->returnCoin();
    }

    ~VendingMachine() {
        delete state;  // 释放状态对象
    }
};

int main() {
    VendingMachine vendingMachine;

    vendingMachine.insertCoin();  // 输出: Coin inserted
    vendingMachine.pressButton();  // 输出: Please insert a coin

    vendingMachine.setState(new HasCoinState());  // 切换状态

    vendingMachine.pressButton();  // 输出: Item dispensed
    vendingMachine.returnCoin();   // 输出: Coin returned

    return 0;
}

在这个示例中,VendingMachine 是上下文类,负责维护当前状态对象,并委托与状态相关的请求给当前状态对象处理。VendingMachineState 是状态接口,定义了各种状态的操作。NoCoinState 和 HasCoinState 是具体状态类,分别代表售货机中没有硬币和有硬币两种状态下的操作。

在 main 函数中,我们创建了售货机对象,并测试了售货机的各种状态下的行为。最后,我们切换了售货机的状态,以展示状态模式的灵活性和可扩展性。

3 总结

通过状态模式,我们可以将与特定状态相关的行为封装到独立的状态类中,使得状态之间的切换变得更加灵活和可维护,同时使上下文类的代码变得简洁清晰。

标签:状态,vendingMachine,void,模式,pressButton,行为,售货机
From: https://www.cnblogs.com/luoxiang/p/17832653.html

相关文章

  • 2024版链动模式开发系统之商品专区解析
      链动2+1模式系统商城的商品专区解析,会员购买专区分为分享专区和精品专区,他们的不同之处在于分享专区的产品,分享专区有激活邀请码的产品,有1元购买产品成为体验会员的优惠产品,在链动2+1模式商城系统里被邀请注册的会员,初始身份是普通会员级别,普通会员没有分享邀请推广的功能。......
  • 设计模式实验12实验13
    外观模式 packagetest12;publicclassMemory{publicvoidcheck(){System.out.println("内存自检");}}packagetest12;publicclassHardDisk{publicvoidread(){System.out.println("硬盘读取");}}packa......
  • 软件设计模式学习每日总结-第二天
    回顾第一天:昨天学习的设计模式中的uml类图,还记得类与类的关系有关联(聚合、组合),依赖,继承,实现,其中依赖的耦合度最小,而继承的耦合度最大,而软件设计追求的就是高内聚,低耦合。还学习各种软件设计原则。第二天创建型模式:将创建和使用分离,使用者不需要关注创建的细节。简单工厂模式:......
  • Unity-观察者模式(observer)
    Unity-观察者模式(observer)引言​ 了解完委托(delegate)与事件(event)之后,我们来讨论一个问题。​ 假设我们有一个热水器,我们给他同上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你温度;2、液晶屏也会改变水温的显示,来提示水已经烧开了​ 现在我们需要写一个程序来模拟这个......
  • Unity-FSM有限状态机
    Unity-FSM有限状态机什么是有限状态机?​ 在编写一些需要判断多个条件的程序时,我们常常会用到if-else语句,这样能够很好的帮我们解决多数问题。但在游戏开发过程中,一个角色的行为不是一成不变的,需要实时的进行修改,此时如果我们使用的是if-else来判断角色所处状态,就需要修改整......
  • Unity-单例模式
    Unity-单例模式前言​ 对于某些特殊的类,我们希望在整个程序的生命周期只创建一个该类的对象,或是希望在其他类没有持有该类的引用,就可以调用该类中的函数,我们就需要将这个类写成单例模式单例的简单实现publicclassTest(){ pubicabstractTestInstance;//创建程序中该......
  • pgsql 查询对应模式下的表结构语句
    selecttable_name,column_name,data_type,udt_name,table_catalog,table_schema,table_name,column_name,ordinal_position,column_defaultfrominformation_schema.columnswheretable_schema='{schema}'andtab......
  • 活动报名 | 数字外贸私享会: 新商机、新模式、新政策,助企业实现弯道超车
    你是否觉得:投入了很多,拓客难度却越来越大?大单来了不敢接?风险不可控物流运输成本高,订单利润越来越低?客户账期长,回款难回款慢,企业资金压力大?“双碳”国策下,不知如何应对?数字时代下,外贸企业仅靠邮件、线下、传统等模式难以突破困局,业务增长缓慢,只有主动出击,借助数字运营模式不断完善获......
  • 学习随笔(设计模式:装饰模式)
    内容今天学习了新的设计模式,装饰模式。装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。收获1.当我们在设计软件时,考虑使用基类和派生类的时候,就可以考虑是否可以使用装饰模式,因为装饰模式比生成子类更加灵活2.当我们对一个已有的类添......
  • Android 11 (MTK)状态栏图标反色-->跟随当前应用变化代码流程
    //StatusBar.javapublicvoidstart(){.............onSystemBarAppearanceChanged(mDisplayId,result.mAppearance,result.mAppearanceRegions,result.mNavbarColorManagedByIme);mAppFullscreen=result.mAppFullscreen;......