您的位置:首页 > 其它

状态模式(State)

2009-12-03 17:53 190 查看

重点概念

1.方法内容如果过长其实就有可能出了问题。

2.当一个对象的内在状态改变时通过调用状态类(一个类)中的方法,同事传递自己(this),状态的判断及执行全部移到了这个状态类当中。

3.状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。





4.状态模式的好处是将与特定状态相关的行为局部化,并且将不同的状态的行为分割开来

5.状态模式是在判断类(Context)中拥有一个抽象状态成员,初始化一个具体的状态对象,在判断类中的状态改变方法中,调用状态对象的公共方法,在这个方法中会要求传入包含状态对象的判断对象this做参数,然后在具体的状态类中去改变this的状态对象,也就是判断类中的状态对象。

6.将特定的状态相关的行为都放入一个对象(ConcreteState)中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地添加新的状态和转换。

7.状态模式的作用就是用于消除庞大的条件分支语句。

8.状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。

示例程序

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespace状态模式
{
classProgram
{
staticvoidMain(string[]args)
{
Contextc=newContext(newConcreteStateA());

c.Request();
c.Request();
c.Request();
c.Request();

Console.Read();
}
}

classContext
{
privateStatestate;

publicContext(Statestate)
{
this.state=state;
}

publicStateState
{
get
{
returnstate;
}
set
{
state=value;
Console.WriteLine("当前状态:"+state.GetType().Name);
}
}

publicvoidRequest()
{
state.Handle(this);
}
}

abstractclassState
{
publicabstractvoidHandle(Contextcontext);
}

classConcreteStateA:State
{
publicoverridevoidHandle(Contextcontext)
{
context.State=newConcreteStateB();
}
}

classConcreteStateB:State
{
publicoverridevoidHandle(Contextcontext)
{
context.State=newConcreteStateA();
}
}

}
上班状态的状态模式版本
类图





代码

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespace状态模式
{
classProgram
{
staticvoidMain(string[]args)
{
//紧急项目
WorkemergencyProjects=newWork();
emergencyProjects.Hour=9;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=10;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=12;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=13;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=14;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=17;

//emergencyProjects.WorkFinished=true;
emergencyProjects.TaskFinished=false;

emergencyProjects.WriteProgram();
emergencyProjects.Hour=19;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=22;
emergencyProjects.WriteProgram();

Console.Read();
}
}

//抽象状态
publicabstractclassState
{
publicabstractvoidWriteProgram(Workw);
}

//上午工作状态
publicclassForenoonState:State
{
publicoverridevoidWriteProgram(Workw)
{
if(w.Hour<12)
{
Console.WriteLine("当前时间:{0}点上午工作,精神百倍",w.Hour);
}
else
{
w.SetState(newNoonState());
w.WriteProgram();
}
}
}

//中午工作状态
publicclassNoonState:State
{
publicoverridevoidWriteProgram(Workw)
{
if(w.Hour<13)
{
Console.WriteLine("当前时间:{0}点饿了,午饭;犯困,午休。",w.Hour);
}
else
{
w.SetState(newAfternoonState());
w.WriteProgram();
}
}
}

//下午工作状态
publicclassAfternoonState:State
{
publicoverridevoidWriteProgram(Workw)
{
if(w.Hour<17)
{
Console.WriteLine("当前时间:{0}点下午状态还不错,继续努力",w.Hour);
}
else
{
w.SetState(newEveningState());
w.WriteProgram();
}
}
}

//晚间工作状态
publicclassEveningState:State
{
publicoverridevoidWriteProgram(Workw)
{
if(w.TaskFinished)
{
w.SetState(newRestState());
w.WriteProgram();
}
else
{
if(w.Hour<21)
{
Console.WriteLine("当前时间:{0}点加班哦,疲累之极",w.Hour);
}
else
{
w.SetState(newSleepingState());
w.WriteProgram();
}
}
}
}

//睡眠状态
publicclassSleepingState:State
{
publicoverridevoidWriteProgram(Workw)
{
Console.WriteLine("当前时间:{0}点不行了,睡着了。",w.Hour);
}
}

//下班休息状态
publicclassRestState:State
{
publicoverridevoidWriteProgram(Workw)
{
Console.WriteLine("当前时间:{0}点下班回家了",w.Hour);
}
}

//工作
publicclassWork
{
privateStatecurrent;
publicWork()
{
current=newForenoonState();
}

privatedoublehour;
publicdoubleHour
{
get{returnhour;}
set{hour=value;}
}

privateboolfinish=false;
publicboolTaskFinished
{
get{returnfinish;}
set{finish=value;}
}

publicvoidSetState(States)
{
current=s;
}

publicvoidWriteProgram()
{
current.WriteProgram(this);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: