狀態(tài)模式(State)允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變行為。結(jié)構(gòu)圖為:

汽車有不同的檔速,當(dāng)行車時(shí),經(jīng)常需要換檔,換檔是從低到高,換檔的過(guò)程就是狀態(tài)的改變過(guò)程。
實(shí)現(xiàn)代碼:
//Car.h
class State;
class Car
{
public:
Car(State*);
virtual ~Car();
void SetState(State*);
void Pull();
private:
State* m_pState;
};
#include "stdafx.h"
#include "Car.h"
#include "State.h"
#include <iostream>
using namespace std;
Car::Car(State* pState)
{
m_pState = pState;
cout << *m_pState;
}
Car::~Car()
{
}
void Car::SetState(State* pState)
{
m_pState = pState;
cout << "掛新檔," << *m_pState;
}
void Car::Pull()
{
m_pState->ChangeState(this);
}
//State.h
#include <iostream>
#include "Car.h"
class State
{
public:
State(char* pName);
virtual ~State();
virtual void ChangeState(Car*) = 0;
friend std::ostream& operator<<(std::ostream& os, State& state);
private:
char* m_pName;
};
//State.cpp
#include "stdafx.h"
#include "State.h"
using namespace std;
State::State(char* pName)
{
m_pName = pName;
}
State::~State()
{
}
ostream& operator<<(ostream& os, State& state)
{
return os << "當(dāng)前檔位:" << state.m_pName << endl;
}
//Off.h
#include "State.h"
class Off : public State
{
public:
Off();
virtual ~Off();
void ChangeState(Car*);
};
//Off.cpp
#include "stdafx.h"
#include "Off.h"
#include "Low.h"
#include <iostream>
using namespace std;
Off::Off() : State("空檔")
{
}
Off::~Off()
{
}
void Off::ChangeState(Car* pCar)
{
pCar->SetState(new Low);
}
//Low.h
#include "State.h"
class Low : public State
{
public:
Low();
virtual ~Low();
void ChangeState(Car*);
};
//Low.cpp
#include "stdafx.h"
#include "Low.h"
#include "Medium.h"
Low::Low() : State("低檔")
{
}
Low::~Low()
{
}
void Low::ChangeState(Car* pCar)
{
pCar->SetState(new Medium);
}
//Medium.h
#include "State.h"
class Medium : public State
{
public:
Medium();
virtual ~Medium();
void ChangeState(Car*);
};
//Medium.cpp
#include "stdafx.h"
#include "Medium.h"
#include "High.h"
Medium::Medium() : State("中檔")
{
}
Medium::~Medium()
{
}
void Medium::ChangeState(Car* pCar)
{
pCar->SetState(new High);
}
//High.h
#include "State.h"
class High : public State
{
public:
High();
virtual ~High();
void ChangeState(Car*);
};
//High.cpp
#include "stdafx.h"
#include "High.h"
#include "Off.h"
High::High() : State("高檔")
{
}
High::~High()
{
}
void High::ChangeState(Car* pCar)
{
pCar->SetState(new Off);
}
//main.cpp
#include "stdafx.h"
#include "Car.h"
#include "Off.h"
int main(int argc, char* argv[])
{
State* pState = new Off;
Car* pCar = new Car(pState);
pCar->Pull();
pCar->Pull();
pCar->Pull();
pCar->Pull();
return 0;
}
最后輸出:
當(dāng)前檔位:空檔
掛新檔,當(dāng)前檔位:低檔
掛新檔,當(dāng)前檔位:中檔
掛新檔,當(dāng)前檔位:高檔
掛新檔,當(dāng)前檔位:空檔