作用:
对象内部分多种状态,并且在各种状态下可以互相切换。
例子:
汽车,可以在停止、启动、运行之间切换。
示例代码:
CarState.h
#ifndef _CAR_STATE_H_
#define _CAR_STATE_H_
class CarContext;
class CarState
{
public:
virtual ~CarState(void);
//需要做以下几件事:
//1.修改CarContext状态
//2.进行自己的操作
virtual void ChangeState(CarContext* con) = 0;
protected:
CarState(void);
};
class CarStop : public CarState
{
public:
CarStop();
~CarStop();
void ChangeState(CarContext* con);
};
class CarStart : public CarState
{
public:
CarStart();
~CarStart();
void ChangeState(CarContext* con);
};
class CarRunnng : public CarState
{
public:
CarRunnng();
~CarRunnng();
void ChangeState(CarContext* con);
};
#endif
CarState.cpp
#include "CarState.h"
#include "CarContext.h"
#include <iostream>
using namespace std;
CarState::CarState(void)
{
}
CarState::~CarState(void)
{
}
CarStop::CarStop()
{
}
CarStop::~CarStop()
{
}
void CarStop::ChangeState(CarContext* con)
{
cout<<"Car Stop-->Start"<<endl;
//设置CarContext新状态
//new的指针必须用delete删除
con->SetState(new CarStart());
}
CarStart::CarStart()
{
}
CarStart::~CarStart()
{
}
void CarStart::ChangeState(CarContext* con)
{
cout<<"Car Start-->Running"<<endl;
//new的指针必须用delete删除
con->SetState(new CarRunnng());
}
CarRunnng::CarRunnng()
{
}
CarRunnng::~CarRunnng()
{
}
void CarRunnng::ChangeState(CarContext* con)
{
cout<<"Car Running-->Stop"<<endl;
//new的指针必须用delete删除
con->SetState(new CarStop());
}
CarContext.h
#pragma once
class CarState;
class CarContext
{
public:
CarContext(CarState* state);
~CarContext(void);
void ChangeState();
void SetState(CarState* state);
private:
CarState* m_state;
};
CarContext.cpp
#include "CarContext.h"
#include "CarState.h"
#include <iostream>
CarContext::CarContext(CarState* state)
{
m_state = state;
}
CarContext::~CarContext(void)
{
if (NULL == m_state)
{
return;
}
delete m_state;
}
void CarContext::ChangeState()
{
m_state->ChangeState(this);
}
void CarContext::SetState( CarState* state )
{
//因为在State类中声明了新指针
//为防止内存泄漏,所以在此需delete原state指针
if (NULL == m_state)
{
m_state = state;
}
delete m_state;
m_state = state;
}
main.cpp
#include "CarContext.h"
#include "CarState.h"
#include <iostream>
void main()
{
CarState* state = new CarStop();
CarContext* con = new CarContext(state);
con->ChangeState();
con->ChangeState();
con->ChangeState();
con->ChangeState();
con->ChangeState();
con->ChangeState();
con->ChangeState();
con->ChangeState();
con->ChangeState();
delete con;
system("pause");
}