Chapter16 状态模式

状态模式简介

状态模式(state),当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转移。

状态模式通过把各种转台转移逻辑分布到State的子类之间,来减少相互间的依赖。

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以参考使用状态模式了。

状态模式UML类图

 

 

C++代码实现

// MyState 抽象类
#ifndef _MYSTATE_HPP
#define _MYSTATE_HPP

class MyState{
public:
    virtual MyState* handle()= 0;
    virtual void getInfo() = 0;
private:
};

#endif
// MyConcreteStateA 类
#ifndef _MYCONCRETESTATEA_HPP
#define _MYCONCRETESTATEA_HPP
#include"mystate.hpp"
#include<iostream>
#include"myconcretestateb.hpp"

using namespace std;

class MyConcreteStateA:public MyState{
public:
    virtual MyState* handle()override{
        return new MyConcreteStateB(); 
    }
    virtual void getInfo() override {
        cout << "MyConcreteStateA->getInfo is called" << endl;
    }

};

#endif
// MyConcreteStateB 类
#ifndef _MYCONCRETESTATEB_HPP
#define _MYCONCRETESTATEB_HPP
#include"mystate.hpp"
#include<iostream>
#include"myconcretestatec.hpp"
using namespace std;

class MyConcreteStateB:public MyState{
public:
    virtual MyState* handle()override{
        return new MyConcreteStateC(); 
    }
    virtual void getInfo() override {
        cout << "MyConcreteStateB->getInfo is called" << endl;
    }

};

#endif

 

//MyConcreteStateC 类
#ifndef _MYCONCRETESTATEC_HPP
#define _MYCONCRETESTATEC_HPP
#include"mystate.hpp"
#include<iostream>
using namespace std;

class MyConcreteStateC:public MyState{
public:
    virtual MyState* handle()override{
        return nullptr;
    }
    virtual void getInfo() override {
        cout << "MyConcreteStateC->getInfo is called" << endl;
    }

};

#endif

 

 

// MyContext类
#ifndef _MYCONTEXT_HPP
#define _MYCONTEXT_HPP

#include"myconcretestatea.hpp"
class MyState;

class MyContext{
public:

    MyContext(MyConcreteStateA* s):state(s){

   }
    void update(){
        state = state->handle();
    }
    MyState* getState(){
        return state;
    }
private:
    MyState* state;
};

#endif
// 客户端代码
#include<iostream>
#include"myconcretestatea.hpp"
#include"mycontext.hpp"

using namespace std;
int main(){
    MyContext* mycon = new MyContext(new MyConcreteStateA());
    mycon->getState()->getInfo();
    mycon->update();
    mycon->getState()->getInfo();
    mycon->update();
    mycon->getState()->getInfo();
    getchar();
    return 0;
}

 

posted @ 2020-03-26 11:30  yangbofun  阅读(111)  评论(0)    收藏  举报