《第5章-状态模式课件.ppt》由会员分享,可在线阅读,更多相关《第5章-状态模式课件.ppt(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第五章第五章 状状态模式模式本章教学内容本章教学内容*工作状工作状态函数版函数版*工作状工作状态分分类版版*状状态模式模式*状状态模式的特点及模式的特点及应用用*工作状工作状态状状态模式版模式版一、工作状态一、工作状态一、工作状态一、工作状态函数版函数版函数版函数版建立一个控制台应用程序,在建立一个控制台应用程序,在progam.cs的的class Program中书写如中书写如下代码:下代码:static int Hour=0;static bool WorkFinished=false;lpublic static void WriteProgram()if(Hour 12)Console
2、.WriteLine(当前时间:当前时间:0点点 上午工作,精神百倍上午工作,精神百倍,Hour);else if(Hour 13)Console.WriteLine(当前时间:当前时间:0点点 饿了,午饭;犯困,午休。饿了,午饭;犯困,午休。,Hour);else if(Hour 17)Console.WriteLine(当前时间:当前时间:0点点 下午状态还不错,继续努力下午状态还不错,继续努力,Hour);else if(WorkFinished)Console.WriteLine(当前时间:当前时间:0点点 下班回家了下班回家了,Hour);else if(Hour 21)Consol
3、e.WriteLine(当前时间:当前时间:0点点 加班哦,疲累之极加班哦,疲累之极,Hour);elseConsole.WriteLine(当前时间:当前时间:0点点 不行了,睡着了。不行了,睡着了。,Hour);二、工作状态二、工作状态二、工作状态二、工作状态分类版分类版分类版分类版封装封装“工作类工作类”:有:有Hour属性属性、TaskFinished属性和属性和WriteProgram()方法。方法。public class Work private int hour;public int Hour get return hour;set hour=value;private boo
4、l finish=false;public bool TaskFinished get return finish;set finish=value;public void WriteProgram()if(hour 12)Console.WriteLine(当前时间:当前时间:0点点 上午工作,精神百倍上午工作,精神百倍,hour);else if(hour 13)Console.WriteLine(当前时间:当前时间:0点点 饿了,午饭;犯困,午休。饿了,午饭;犯困,午休。,hour);else if(hour 17)Console.WriteLine(当前时间:当前时间:0点点 下午状态
5、还不错,继续努力下午状态还不错,继续努力,hour);else if(finish)Console.WriteLine(当前时间:当前时间:0点点 下班回家了下班回家了,hour);else if(hour 21)Console.WriteLine(当前时间:当前时间:0点点 加班哦,疲累之极加班哦,疲累之极,hour);else Console.WriteLine(当前时间:当前时间:0点点 不行了,睡着了。不行了,睡着了。,hour);注意小写注意小写h客户端客户端 class Program static void Main(string args)Work emergencyProje
6、cts=new Work();emergencyProjects.Hour=9;emergencyProjects.WriteProgram();emergencyProjects.Hour=10;emergencyProjects.WriteProgram();emergencyProjects.Hour=12;emergencyProjects.WriteProgram();emergencyProjects.Hour=13;emergencyProjects.WriteProgram();emergencyProjects.Hour=14;emergencyProjects.WriteP
7、rogram();emergencyProjects.Hour=17;/emergencyProjects.TaskFinished=true;emergencyProjects.TaskFinished=false;emergencyProjects.WriteProgram();emergencyProjects.Hour=19;emergencyProjects.WriteProgram();emergencyProjects.Hour=22;emergencyProjects.WriteProgram();Console.Read();对于语句对于语句emergencyProjects
8、.TaskFinished=false;对于语句对于语句emergencyProjects.TaskFinished=true;注意大写注意大写H三、状态模式三、状态模式三、状态模式三、状态模式1.1.定义定义状态模式(状态模式(State),当一个对象的内在状态改变时允许改变其行为,这),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。个对象看起来像是改变了其类。abstract class State public abstract void Handle(Context context);class ConcreteStateA:State public over
9、ride void Handle(Context context)context.State=new ConcreteStateB();class ConcreteStateB:State public override void Handle(Context context)context.State=new ConcreteStateA();class Context private State state;public Context(State state)this.state=state;public State State get return state;set state=va
10、lue;Console.WriteLine(当前状态当前状态:+state.GetType().Name);public void Request()state.Handle(this);带参数的构造函数,定义带参数的构造函数,定义Context的初始状态的初始状态对请求做处理,并设置下一状态对请求做处理,并设置下一状态2.2.2.2.实际应用实际应用实际应用实际应用 (1)状态模式在状态模式在工作流工作流或或游戏游戏等类型的软件中得以广泛使用,甚至可等类型的软件中得以广泛使用,甚至可以用于这些系统的核心功能设计,如在政府以用于这些系统的核心功能设计,如在政府OA办公系统中,一个批办公系统中,
11、一个批文的状态有多种:尚未办理;正在办理;正在批示;正在审核;已文的状态有多种:尚未办理;正在办理;正在批示;正在审核;已经完成等各种状态,而且批文状态不同时对批文的操作也有所差异。经完成等各种状态,而且批文状态不同时对批文的操作也有所差异。使用状态模式可以描述工作流对象(如批文)的状态转换以及不同使用状态模式可以描述工作流对象(如批文)的状态转换以及不同状态下它所具有的行为状态下它所具有的行为。(2)在目前主流的在目前主流的RPG(Role Play Game,角色扮演游戏)中,角色扮演游戏)中,使使用状态模式可以对游戏角色进行控制用状态模式可以对游戏角色进行控制,游戏角色的升级伴随着其状,
12、游戏角色的升级伴随着其状态的变化和行为的变化。对于游戏程序本身也可以通过状态模式进态的变化和行为的变化。对于游戏程序本身也可以通过状态模式进行总控,一个游戏活动包括开始、运行、结束等状态,通过对状态行总控,一个游戏活动包括开始、运行、结束等状态,通过对状态的控制可以控制系统的行为,决定游戏的各个方面,因此的控制可以控制系统的行为,决定游戏的各个方面,因此可以使用可以使用状态模式对整个游戏的架构进行设计与实现状态模式对整个游戏的架构进行设计与实现。/上午工作状态上午工作状态 public class ForenoonState:State public override void WritePr
13、ogram(Work w)if(w.Hour 12)Console.WriteLine(当前时间:当前时间:0点点 上午工作,精神百倍上午工作,精神百倍,w.Hour);else w.SetState(new NoonState();w.WriteProgram();/中午工作状态中午工作状态 public class NoonState:State public override void WriteProgram(Work w)if(w.Hour 13)Console.WriteLine(当前时间:当前时间:0点点 饿了,午饭;犯困,午休。饿了,午饭;犯困,午休。,w.Hour);else
14、 w.SetState(new AfternoonState();w.WriteProgram();/下午工作状态下午工作状态 public class AfternoonState:State public override void WriteProgram(Work w)if(w.Hour 17)Console.WriteLine(当前时间:当前时间:0点点 下午状态还不错,继续努力下午状态还不错,继续努力,w.Hour);else w.SetState(new EveningState();w.WriteProgram();/晚间工作状态晚间工作状态 public class Even
15、ingState:State public override void WriteProgram(Work w)if(w.TaskFinished)w.SetState(new RestState();w.WriteProgram();else if(w.Hour 21)Console.WriteLine(当前时间:当前时间:0点点 加班哦,疲累之极加班哦,疲累之极,w.Hour);else w.SetState(new SleepingState();w.WriteProgram();/睡眠状态睡眠状态 public class SleepingState:State public over
16、ride void WriteProgram(Work w)Console.WriteLine(当前时间:当前时间:0点点 不行了,睡着了。不行了,睡着了。,w.Hour);/下班休息状态下班休息状态 public class RestState:State public override void WriteProgram(Work w)Console.WriteLine(当前时间:当前时间:0点点 下班回家了下班回家了,w.Hour);class Program static void Main(string args)/紧急项目紧急项目 Work emergencyProjects=ne
17、w Work();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
18、();emergencyProjects.Hour=17;/emergencyProjects.WorkFinished=true;emergencyProjects.TaskFinished=false;emergencyProjects.WriteProgram();emergencyProjects.Hour=19;emergencyProjects.WriteProgram();emergencyProjects.Hour=22;emergencyProjects.WriteProgram();Console.Read();练习题(练习题(练习题(练习题(P170P170)增加条件:员工必须在增加条件:员工必须在增加条件:员工必须在增加条件:员工必须在2020点之前离开公司点之前离开公司点之前离开公司点之前离开公司*ENDENDThanks!