class State
{
public:
virtual ~State() = default;
virtual void display() = 0;
protected:
State() = default;
private:
};
1.2. ConcreteState(具体状态类)
class NormalState : public State
{
public:
NormalState()
{
std::cout << "NormalState 构造函数" << std::endl;
}
~NormalState() override
{
std::cout << "~NormalState 析构函数" << std::endl;
}
void display() override
{
std::cout << "正常大小" << std::endl;
}
private:
};
class DoubleState : public State
{
public:
DoubleState()
{
std::cout << "DoubleState 构造函数" << std::endl;
}
~DoubleState() override
{
std::cout << "~DoubleState 析构函数" << std::endl;
}
void display() override
{
std::cout << "两倍大小" << std::endl;
}
private:
};
class QuadrupleState : public State
{
public:
QuadrupleState()
{
std::cout << "QuadrupleState 构造函数" << std::endl;
}
~QuadrupleState() override
{
std::cout << "~QuadrupleState 析构函数" << std::endl;
}
void display() override
{
std::cout << "四倍大小" << std::endl;
}
private:
};
1.3. Context(上下文):Screen
//枚举型
enum ScreenState
{
normal_state, //正常状态
double_state, //两倍放大状态
quadruple_state //四倍放大状态
};
//Screen
class Screen
{
public:
Screen()
{
m_ScreenState = ScreenState::nromal_state;
m_eNormalState = new NormalState();
m_eDoubleState = new DoubleState();
m_eQuadrupleState = new QuadrupleState();
}
~Screen()
{
delete m_eNormalState;
delete m_eDoubleState;
delete m_eQuadrupleState;
}
void onClick()
{
std::cout << "点击一下,";
if (m_ScreenState == ScreenState::normal_state)
{
m_eDoubleState->display();
setState(ScreenState::double_state);
}
else if (m_ScreenState == ScreenState::double_state){
m_eQuadrupleState->display();
setState(ScreenState::quadruple_state);
}
else if (m_ScreenState == ScreenState::quadruple_state) {
m_eNormalState->display();
setState(ScreenState::nromal_state);
}
}
private:
void setState(const ScreenState state)
{
this->m_ScreenState = state;
}
private:
State *m_eNormalState;
State *m_eDoubleState;
State *m_eQuadrupleState;
ScreenState m_ScreenState;
};
1.4. 主函数
#include2. 状态类来负责状态之间的转换#include #include using namespace std; int main() { std::cout << "==环境类来负责状态之间的转换==" << std::endl; std::cout << "初始" << std::endl; auto *screen = new Screen(); std::cout << "点击 click 测试" << std::endl; screen->onClick(); screen->onClick(); screen->onClick(); screen->onClick(); screen->onClick(); delete screen; getchar(); return 0; }
//状态类中引用了Screen类,所以必须提前声明 class Screen;2.1. State(抽象状态类)
class State
{
public:
virtual ~State() = default;
virtual void changeState(Screen *screen) = 0;
virtual void display() = 0;
protected:
State() = default;
private:
};
2.2. ConcreteState(具体状态类)
//
class NormalState : public State
{
public:
NormalState()
{
std::cout << "NormalState 构造函数" << std::endl;
}
~NormalState() override
{
std::cout << "~NormalState 析构函数" << std::endl;
}
void changeState(Screen *screen) override;
void display() override
{
std::cout << "正常大小" << std::endl;
}
private:
};
//
class DoubleState : public State
{
public:
DoubleState()
{
std::cout << "DoubleState 构造函数" << std::endl;
}
~DoubleState() override
{
std::cout << "~DoubleState 析构函数" << std::endl;
}
void changeState(Screen *screen) override;
void display() override
{
std::cout << "两倍大小" << std::endl;
}
private:
};
//
class QuadrupleState : public State
{
public:
QuadrupleState()
{
std::cout << "QuadrupleState 构造函数" << std::endl;
}
~QuadrupleState() override
{
std::cout << "~QuadrupleState 析构函数" << std::endl;
}
void changeState(Screen *screen) override;
void display() override
{
std::cout << "四倍大小" << std::endl;
}
private:
};
2.3. Context(上下文):Screen
//枚举型
enum ScreenState
{
normal_state, //正常状态
double_state, //两倍放大状态
quadruple_state //四倍放大状态
};
//Context(上下文):Screen
class Screen
{
public:
Screen()
{
m_ScreenState = ScreenState::normal_state;
m_pCurrentState = nullptr;
m_pNormalState = new NormalState();
m_pDoubleState = new DoubleState();
m_pQuadrupleState = new QuadrupleState();
//必须调用,相当于给m_pCurrentState初始化
setState(ScreenState::normal_state);
}
~Screen()
{
delete m_pNormalState;
delete m_pDoubleState;
delete m_pQuadrupleState;
}
void onClick()
{
std::cout << "点击一下,";
m_pCurrentState->changeState(this);
}
void setState(const ScreenState &state)
{
this->m_ScreenState = state;
if (m_ScreenState == ScreenState::normal_state)
{
m_pCurrentState = m_pNormalState;
}
else if (m_ScreenState == ScreenState::double_state) {
m_pCurrentState = m_pDoubleState;
}
else if (m_ScreenState == ScreenState::quadruple_state) {
m_pCurrentState = m_pQuadrupleState;
}
}
private:
State *m_pCurrentState;
State *m_pNormalState;
State *m_pDoubleState;
State *m_pQuadrupleState;
ScreenState m_ScreenState;
};
ConcreteState(具体状态类)中changeState必须放在Screen类之后实现:
void NormalState::changeState(Screen *screen)
{
display();
screen->setState(ScreenState::double_state);
}
void DoubleState::changeState(Screen *screen)
{
display();
screen->setState(ScreenState::quadruple_state);
}
void QuadrupleState::changeState(Screen *screen)
{
display();
screen->setState(ScreenState::normal_state);
}
2.4. 主函数
#include#include #include using namespace std; int main() { std::cout << "==由具体状态类来负责状态之间的转换==" << std::endl; std::cout << "初始" << std::endl; auto *screen = new Screen(); std::cout << "点击 click 测试" << std::endl; screen->onClick(); screen->onClick(); screen->onClick(); screen->onClick(); screen->onClick(); delete screen; getchar(); return 0; }



