设计模式教学ppt课件

上传人:94****0 文档编号:241318588 上传时间:2024-06-17 格式:PPT 页数:35 大小:942.96KB
返回 下载 相关 举报
设计模式教学ppt课件_第1页
第1页 / 共35页
设计模式教学ppt课件_第2页
第2页 / 共35页
设计模式教学ppt课件_第3页
第3页 / 共35页
点击查看更多>>
资源描述
状态(State)模式状态(State)模式l状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的逻辑简化。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复工作状态public class Work /钟点 private int hour;public int Hour get return hour;set hour=value;/任务完成 private bool finish=false;public bool TaskFinished get return finish;set finish=value;工作状态public class Work 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点 下午状态还不错,继续努力,hour);public void WriteProgr else if(finish)Console.WriteLine(当前时间:0点 下班回家了,hour);else if(hour 21)Console.WriteLine(当前时间:0点 加班哦,疲累之极,hour);else Console.WriteLine(当前时间:0点 不行了,睡着了。,hour);elseclass Program static void Main(string args)/紧急项目 Work emergencyProjects=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.WriteProgram();emergencyProjects.Hour=17;class Program /emergencyProjects.TaskFinished=true;emergencyProjects.TaskFinished=false;emergencyProjects.WriteProgram();emergencyProjects.Hour=19;emergencyProjects.WriteProgram();emergencyProjects.Hour=22;emergencyProjects.WriteProgram();Console.Read();/emergencyProjects.l方法过长是坏味道l面向对象设计其实就是希望做到代码的责任分解l上例违背了“单一职责原则”、“开放-封闭原则”方法过长是坏味道状态模式l允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。l状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的逻辑简化。状态模式允许一个对象在其内部状态改变时改变它的行为,这个对象l每个人、事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下 转移到下一个不同的状态(State)。l一个生活中的例子:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过。在出口处也是验票,如果正确你就可以OK,否则就不让你通过。每个人、事物在不同的状态下会有不同表现(动作),而一个状态又l有限状态自动机(FSM)也是一个典型的状态不同,对输入有不同的响应(状态转移)。l通常我们在实现这类系统会使用到很多的Switch-Case语句或者IfElse语句,Case某种状态,发生某种动作,Case另外一种状态,则发生另外一种动作。但是这种实现方式至少有以下两个问题:有限状态自动机(FSM)也是一个典型的状态不同,对输入有不同l当状态数目不是很多的时候,Switch-Case可能可以搞定。但是当状态数目很多的时候(实际系统中也正是如此),维护一大一大组的的Switch-Case语句将是一件句将是一件异常困异常困难并且容易出并且容易出错的事情的事情。l状状态逻辑和和动作作实现没有分离。没有分离。在很多的系统实现中,动作的实现代码直接写在状态的逻辑当中。这带来的后果就是系统的扩展性和维护得不到保证。当状态数目不是很多的时候,Switch-Case可能可以搞lState模式就是被用来解决上面列出的两个问题的,在State模式中我们将状态逻辑和动作实现进行分离。当一个操作中要维护大量的分支语句,并且这些分支依赖于对象的状态。State模式将每一个分支都封装到独立的类中。State模式典型的结构图为:State模式就是被用来解决上面列出的两个问题的,在Stat设计模式教学ppt课件示例性代码l 定义一个接口或抽象类,以封装与Context的一个特定状态相关的行为abstract class State public abstract void Handle(Context context);示例性代码 定义一个接口或抽象类,以封装与Context的一具体状态l每一个子类实现一个与Context的一个状态相关的行为 class ConcreteStateA:State public override void Handle(Context context)context.State=new ConcreteStateB();class ConcreteStateB:State public override void Handle(Context context)context.State=new ConcreteStateA();具体状态每一个子类实现一个与Context的一个状态相关的行Context类 class Context private State state;public Context(State state)this.state=state;public State State get return state;set state=value;Console.WriteLine(当前状态:+state.GetType().Name);public void Request()state.Handle(this);Context类 class Context客户端 class Program static void Main(string args)Context c=new Context(new ConcreteStateA();c.Request();c.Request();c.Request();c.Request();Console.Read();客户端 class Program工作状态-状态模式版工作状态-状态模式版工作(Context)public class Work private State current;public Work()current=new ForenoonState();private double hour;public double Hour get return hour;set hour=value;工作(Context)public class Work private bool finish=false;public bool TaskFinished get return finish;set finish=value;public void SetState(State s)current=s;public void WriteProgram()current.WriteProgram(this);private bool finish=抽象状态public abstract class State public abstract void WriteProgram(Work w);抽象状态public abstract class Stat具体状态 public class ForenoonState:State public override void WriteProgram(Work w)if(w.Hour 12)Console.WriteLine(当前时间:0点 上午工作,精神百倍,w.Hour);else w.SetState(new NoonState();w.WriteProgram();具体状态 public class ForenoonStat public class NoonState:State public override void WriteProgram(Work w)if(w.Hour 13)Console.WriteLine(当前时间:0点 饿了,午饭;犯困,午休。,w.Hour);else w.SetState(new AfternoonState();w.WriteProgram();public class NoonState:Stat 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 AfternoonState:public class EveningState: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 EveningState:S public class SleepingState:State public override void WriteProgram(Work w)Console.WriteLine(当前时间:0点 不行了,睡着了。,w.Hour);public class RestState:State public override void WriteProgram(Work w)Console.WriteLine(当前时间:0点 下班回家了,w.Hour);public class SleepingState:class Program static void Main(string args)Work emergencyProjects=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.WriteProgram();emergencyProjects.Hour=17;class Program/*如果要员工必须在20点之前离开公司,只需添加下面的“强制下班状态”,并改动 EveningState类的判断就可以了 emergencyProjects.WorkFinished=true;*/emergencyProjects.TaskFinished=false;emergencyProjects.WriteProgram();emergencyProjects.Hour=19;emergencyProjects.WriteProgram();emergencyProjects.Hour=22;emergencyProjects.WriteProgram();Console.Read();/*如果要员工必须在20点之前离开公司,只需添加下面的“强制状态模式优点l将与特定状态相关的行为局部化,并且将不同状态的行为分割开来l消除庞大的条件分支语句,把各种状态转移逻辑分布到State的子类之间,减少了相互间的依赖。l显式化进行状态转换:为不同的状态引入独立的对象,使得状态的转换变得更加明确。而且状态对象可以保证上下文不会发生内部状态不一致的状况,因为上下文中只有一个变量来记录状态对象,只要为这一个变量赋值就可以了。状态模式优点将与特定状态相关的行为局部化,并且将不同状态的行状态模式缺点lState模式问题主要是逻辑分散化,状态逻辑分布到了很多的State的子类中,很难看到整个的状态逻辑图,这也带来了代码的维护问题。状态模式缺点State模式问题主要是逻辑分散化,状态逻辑分布本质l根据状态来分离和选择行为l状态模式是状态驱动,由上下文负责本质根据状态来分离和选择行为State模式和Strategy模式简单比较lState模式和Strategy模式有很大程度上的相似:它们都有一个Context类,都是通过委托(组合)给一个具有多个派生类的多态基类实现Context的算法逻辑l两者最大的差别就是State模式中派生类持有指向Context对象的引用,并通过这个引用调用Context中的方法,但在Strategy模式中就没有这种情况。State模式和Strategy模式简单比较State模式和实例一l在线投票l同一个用户只能投一票l如果一个用户反复投票,而且投票次数超过5次,判定为恶意投票,要取消该用户的投票资格,并取消他所投的票l若超过8次,将进入黑名单,禁止再登录和使用系统。实例一在线投票实例二l工作流中的请假流程l某人提出请假申请,先由项目经理审批,如果项目经理不同意,审批就直接结束l如项目经理同意,再看是否超过3天,如果三天以内,审批直接结束l否则,交给部门经理,部门经理审核后,无论是否同意,审批直接结束实例二工作流中的请假流程
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!