适用情境:一个对象的运行时行为根据自身的状态不同而改变.
// state.h
#ifndef STATE_H
#define STATE_H
class Device;
class State
{
public:
State();
virtual void ShowState(Device * dev) = 0;
};
#endif // STATE_H
// state.cpp
#include "state.h"
State::State()
{}
// concretestatea.h
#ifndef CONCRETESTATEA_H
#define CONCRETESTATEA_H
#include "state.h"
class ConcreteStateA : public State
{
public:
ConcreteStateA();
virtual void ShowState(Device* dev);
};
#endif // CONCRETESTATEA_H
// concretestatea.cpp
#include "concretestatea.h"
#include "device.h"
#include <iostream>
#include "concretestateb.h"
ConcreteStateA::ConcreteStateA()
{}
void ConcreteStateA::ShowState(Device *dev)
{
std::cout << dev->m_code << std::endl;
dev->state = new ConcreteStateB();
dev->m_code = 222;
}
// concretestateb.h
#ifndef CONCRETESTATEB_H
#define CONCRETESTATEB_H
#include "state.h"
class ConcreteStateB : public State
{
public:
ConcreteStateB();
virtual void ShowState(Device* dev);
};
#endif // CONCRETESTATEB_H
// concretestateb.cpp
#include "concretestateb.h"
#include "concretestatea.h"
#include <iostream>
#include "device.h"
ConcreteStateB::ConcreteStateB()
{}
void ConcreteStateB::ShowState(Device *dev)
{
std::cout << dev->m_code << std::endl;
dev->state = new ConcreteStateA();
dev->m_code = 111;
}
// device.h
#ifndef DEVICE_H
#define DEVICE_H
#include "state.h"
class Device
{
public:
Device();
void Run();
public:
State *state;
int m_code;
};
#endif // DEVICE_H
// device.cpp
#include "device.h"
#include "concretestatea.h"
Device::Device()
{
state = new ConcreteStateA();
m_code = 111;
}
void Device::Run()
{
state->ShowState(this);
}
客户端:
// main.cpp
#include <iostream>
#include "device.h"
using namespace std;
int main(int argc, char *argv[])
{
Device *dev = new Device();
dev->Run();
dev->Run();
dev->Run();
dev->Run();
return 0;
}