状态模式(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);
}
}
}
相关文章推荐
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 3.8 State(状态) -- 对象行为型模式
- 【设计模式 - 20】之状态模式(State)
- 设计模式(12)--State状态模式&Strategy策略模式
- JAVA设计模式(18):行为型-状态模式(State)
- 【行为型模式】状态模式(state)之23种java设计模式
- 设计模式C++学习笔记之十九(State状态模式)
- 设计模式之状态模式(State)摘录
- C#设计模式系列 6 ----State 状态模式 之--电视36计,我要自己掌握遥控器
- 23设计模式之状态模式(State)
- 设计模式之State(状态)
- 浅谈Java设计模式(二十)状态模式(State)
- STATE(状态)模式
- 状态模式(State)
- ASP.NET Session State(会话状态)SQLServer模式和设置
- 设计模式C++学习笔记之十九(State状态模式)
- (Boolan)C++设计模式 <十> ——状态模式(State)和备忘录(Memento)
- 设计模式一日一练:状态模式(State)
- 设计模式--状态模式(State)
- State模式(状态模式)消除烦琐的if..else语句