状态模式——现代C++设计模式

状态模式——现代C++设计模式

生活中我们可能有着喜怒哀乐等多个状态,不同状态下的行为也不同,该如何表示呢?

介绍

状态模式的原理:状态控制着行为,状态可以发生转变,需要设计触发状态的变化

实现代码

#include<vector>
#include<string>
#include<map>
#include<iostream>
using namespace std;

enum class State {
    off_hook,
    connecting,
    connected,
    on_hold,
    on_hook
};

enum class Trigger {
    call_dialed, hung_up, call_connected, placed_on_hold, taken_off_hold, left_message, stop_using_phone
};
ostream& operator<<(ostream& os, const Trigger myEnum)
{
    string s;
    switch (myEnum)
    {
    case  Trigger::call_dialed:
        s = "call_dialed"; break;
    case Trigger::hung_up:
        s = " hung_up"; break;
    case  Trigger::call_connected:
        s = "call_connected"; break;
    case Trigger::placed_on_hold:
        s = " placed_on_hold"; break;
    case Trigger::taken_off_hold:
        s = "taken_off_hold"; break;
    case Trigger::stop_using_phone:
        s = "stop_using_phone"; break;
    case Trigger::left_message:
        s = " left_message"; break;
    }
    os << s << endl;
    return os;
}

ostream& operator<<(ostream& os, const State myEnum)
{
    string s;
    switch (myEnum)
    {
    case  State::off_hook:
        s = "off_hook"; break;
    case State::connecting:
        s = "connecting"; break;
    case  State::connected:
        s = "connected"; break;
    case State::on_hold:
        s = "on_hold"; break;
    default:
        s = "on_hook";//on_hook
        break;
    }
    os << s << endl;
    return os;
}

int main() 
{
    map<State, vector<pair<Trigger, State>>> rules;   //记录每个状态下的trigger
    rules[State::off_hook] = {  //设置trigger
        {Trigger::call_dialed, State::connecting },
        {Trigger::stop_using_phone, State::on_hook}
    };
    rules[State::connecting] = {
        {Trigger::hung_up, State::off_hook},{Trigger::call_connected, State::connected}
    };
    State currentState{ State::off_hook }, exitState{ State::on_hook };   //设置初始状态和退出状态

    while (1) {    //状态机根据trigger进行切换
    cout << "The phone is currently " << currentState << endl; 
select_trigger:
    cout << "Select a trigger:" << "\n";
    int i = 0; 
    for (auto item : rules[currentState])
       cout << i++ << "." << item.first << "\n";
    int input;
    cin >> input;
    if (input<0||(input + 1)>rules[currentState].size())
        cout << "Incorrect option. Please try again." << "\n";
    goto select_trigger;
    currentState = rules[currentState][input].second;
    if (currentState == exitState)
        break;
    
    }
    return 0;
}

本例中通过enum class设计了状态机,实现了状态模式的状态转换。

总结

状态模式中将对象划分为多个状态,不同状态对应着不同行为,我们可以使用状态机形式作为状态转换的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值