旅游網(wǎng)站設(shè)計(jì)說明書網(wǎng)絡(luò)營銷推廣方案步驟
1、狀態(tài)模式的提出
在組件功能開發(fā)過程中,某些對象的狀態(tài)經(jīng)常面臨變化,不同的狀態(tài),其對象的操作行為不同。比如根據(jù)狀態(tài)寫的if else條件情況,且這種條件變化是經(jīng)常變化的,這樣的代碼不易維護(hù)??梢允褂脿顟B(tài)模式解決這類問題。狀態(tài)模式是將狀態(tài)值抽象成一個(gè)基類,將不同狀態(tài)下的操作,封裝成基類中的虛函數(shù),使用者可以依賴抽象的基類來進(jìn)行功能開發(fā)。
2、需求描述
一年有不同節(jié)日,不同的節(jié)日穿不同的衣服,吃不同的食物。節(jié)日可能會隨著人們的生活習(xí)俗不斷地增加。設(shè)計(jì)一個(gè)根據(jù)不同地節(jié)日,返回對應(yīng)穿著和食物方面的功能代碼。
3、狀態(tài)模式的代碼實(shí)現(xiàn)
(1)UML圖如下:
(2)代碼實(shí)現(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;
}
?程序運(yùn)行結(jié)果如下: