名称: 状态模式
说说:
动机:
适用性:
参与者:
结果:允许对象在内部状态改变时,改变自身的行为
类图:
说明:把状态改变的权力交给状态对象(本该属于context 的)
demo c#:
namespace state {
class Program {
static void Main(string[] args) {
context c = new context();
c.shopping();
c.shopping();
c.shopping();
c.shopping();
Console.Read();
}
}
// main code
interface iState {
void handle(context c);
}
class search : iState {
public void handle(context c) {
if (c.data == "") {
Console.WriteLine("找到一家服装店,开始选衣服了");
c.data = "search";
c.currentState = new tryOn();
} else {
c.data = "error!";
Console.WriteLine("error on state of search!");
}
}
}
class tryOn : iState {
public void handle(context c) {
if (c.data == "search") {
Console.WriteLine("选好衣服了,开始试衣服");
c.data = "tryOn";
c.currentState = new pay();
} else {
c.data = "error!";
Console.WriteLine("error on state of tryOn!");
}
}
}
class pay : iState {
public void handle(context c) {
if (c.data == "tryOn") {
Console.WriteLine("衣服不错,结账");
c.data = "pay";
c.currentState = new package();
} else {
c.data = "error!";
Console.WriteLine("error on state of pay!");
}
}
}
class package : iState {
public void handle(context c) {
if (c.data == "pay") {
Console.WriteLine("买好了,走人");
c.data = "";
c.currentState = new search();
} else {
c.data = "error!";
Console.WriteLine("error on state of package!");
}
}
}
// 以买衣服为例 假设分:1挑选 2试穿 3付钱 4打包 几个状态
class context {
object _data;
iState _currentState;
public context() {
this.data = "";
this._currentState = new search();
}
public void shopping() {
this._currentState.handle(this);
}
public iState currentState {
get { return this._currentState;}
set { this._currentState = value;}
}
public object data{
get { return this._data; }
set { this._data = value; }
}
}
}