定义:允许一个对象在其内部状态发生改变时改变他的行为。对象看起来似乎修改了它的类。(类的行为是基于它的状态改变的,使用状态模式可以有效解决代码中if-else和switch的case太多的问题,使代码更容易维护)
UML类图:
C++实现:
#include<iostream>
#include<string>
using namespace std;
class Context;
class IState
{
public:
virtual void doAction(Context*) = 0;
virtual string toString() = 0;
virtual ~IState() {}
};
class Context
{
public:
IState* state;
Context();
IState* getState();
void setState(IState* state);
~Context() {}
};
class StartState :public IState
{
public:
virtual void doAction(Context* context);
virtual string toString();
virtual ~StartState() {}
};
class StopState :public IState
{
public:
virtual void doAction(Context* context);
virtual string toString();
virtual ~StopState() {}
};
//实现
Context::Context()
{
state = 0;
}
IState* Context::getState()
{
return state;
}
void Context::setState(IState* state)
{
this->state = state;
}
void StartState::doAction(Context* context)
{
cout << "now is Start_State!" << endl;
context->setState(this);
}
string StartState::toString()
{
return "Strat State!";
}
void StopState::doAction(Context* context)
{
cout << "now is Stop_State!" << endl;
context->setState(this);
}
string StopState::toString()
{
return "Stop State!";
}
int main()
{
Context* context = new Context();
IState* state;
StartState* state1 = new StartState();
StopState* state2 = new StopState();
state1->doAction(context);
cout << context->getState()->toString() << endl;
state2->doAction(context);
cout << context->getState()->toString() << endl;
return 0;
}
C#实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
interface IState
{
void doAction(Context context);
String toString();
}
class StartState : IState
{
public void doAction(Context context)
{
Console.WriteLine("now is Start State!");
context.setState(this);
}
public String toString()
{
return "StrateState";
}
}
class StopState : IState
{
public void doAction(Context context)
{
Console.WriteLine("now is Stop State!");
context.setState(this);
}
public String toString()
{
return "StopState";
}
}
class Context
{
private IState state;
public Context()
{
state = null;
}
public void setState(IState state)
{
this.state = state;
}
public IState getState()
{
return state;
}
}
class Program
{
static void Main(string[] args)
{
Context context = new Context();
StartState startState = new StartState();
startState.doAction(context);
Console.WriteLine(context.getState().toString());
StopState stopState = new StopState();
stopState.doAction(context);
Console.WriteLine(context.getState().toString());
}
}
}