1、状态模式的提出
在组件功能开发过程中,某些对象的状态经常面临变化,不同的状态,其对象的操作行为不同。比如根据状态写的if else条件情况,且这种条件变化是经常变化的,这样的代码不易维护。可以使用状态模式解决这类问题。状态模式是将状态值抽象成一个基类,将不同状态下的操作,封装成基类中的虚函数,使用者可以依赖抽象的基类来进行功能开发。
2、需求描述
一年有不同节日,不同的节日穿不同的衣服,吃不同的食物。节日可能会随着人们的生活习俗不断地增加。设计一个根据不同地节日,返回对应穿着和食物方面的功能代码。
3、状态模式的代码实现
(1)UML图如下:

(2)代码实现如下:
#include <iostream>
class AbsFestival
{
public:
    virtual ~AbsFestival(){};
    virtual void Eat()=0;
    virtual void Wear()=0;
};
class FestivalA:public AbsFestival
{
public:
    static FestivalA* getInstance()
    {
        static FestivalA obj;
        return &obj;
    };
    virtual void Eat()override
    {
        std::cout << "FestivalA Eat" << std::endl;
    }
    virtual void Wear()override
    {
        std::cout << "FestivalA Wear" << std::endl;
    };
};
class FestivalB:public AbsFestival
{
public:
    static FestivalB* getInstance()
    {
        static FestivalB obj;
        return &obj;
    };
    virtual void Eat()override
    {
        std::cout << "FestivalB Eat" << std::endl;
    }
    virtual void Wear()override
    {
        std::cout << "FestivalB Wear" << std::endl;
    };
};
class FestivalC:public AbsFestival
{
public:
    static FestivalC* getInstance()
    {
        static FestivalC obj;
        return &obj;
    };
    virtual void Eat()override
    {
        std::cout << "FestivalC Eat" << std::endl;
    }
    virtual void Wear()override
    {
        std::cout << "FestivalC Wear" << std::endl;
    };
};
class FestivalD:public AbsFestival
{
public:
    virtual void Eat()override
    {
        std::cout << "FestivalD Eat" << std::endl;
    }
    virtual void Wear()override
    {
        std::cout << "FestivalD Wear" << std::endl;
    };
};
class Client
{
protected:
    AbsFestival *time;
public:
    void SetTime(AbsFestival* p)
    {
        time = p;
    }
    void DoWork()
    {
        time->Eat();
        time->Wear();
    }
};
int main()
{
    Client useObj;
    FestivalA festivalA;
    useObj.SetTime(festivalA.getInstance());
    useObj.DoWork();
    FestivalB festivalB;
    useObj.SetTime(festivalB.getInstance());
    useObj.DoWork();
    FestivalC festivalC;
    useObj.SetTime(festivalC.getInstance());
    useObj.DoWork();
    FestivalD* festivalD = new FestivalD();
    useObj.SetTime(festivalD);
    useObj.DoWork();
    delete festivalD;
    festivalD = nullptr;
    return 0;
}
程序运行结果如下:




















