生活中我们可能有着喜怒哀乐等多个状态,不同状态下的行为也不同,该如何表示呢?
介绍
状态模式的原理:状态控制着行为,状态可以发生转变,需要设计触发状态的变化
实现代码
#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设计了状态机,实现了状态模式的状态转换。
总结
状态模式中将对象划分为多个状态,不同状态对应着不同行为,我们可以使用状态机形式作为状态转换的方法