1、狀態(tài)模式的提出
在組件功能開發(fā)過程中,某些對象的狀態(tài)經(jīng)常面臨變化,不同的狀態(tài),其對象的操作行為不同。比如根據(jù)狀態(tài)寫的if else條件情況,且這種條件變化是經(jīng)常變化的,這樣的代碼不易維護。可以使用狀態(tài)模式解決這類問題。狀態(tài)模式是將狀態(tài)值抽象成一個基類,將不同狀態(tài)下的操作,封裝成基類中的虛函數(shù),使用者可以依賴抽象的基類來進行功能開發(fā)。
2、需求描述
一年有不同節(jié)日,不同的節(jié)日穿不同的衣服,吃不同的食物。節(jié)日可能會隨著人們的生活習(xí)俗不斷地增加。設(shè)計一個根據(jù)不同地節(jié)日,返回對應(yīng)穿著和食物方面的功能代碼。
3、狀態(tài)模式的代碼實現(xiàn)
(1)UML圖如下:
(2)代碼實現(xiàn)如下:
#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;
}
?程序運行結(jié)果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-660066.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-660066.html
到了這里,關(guān)于設(shè)計模式之狀態(tài)模式(State)的C++實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!