收藏 分享(赏)

16 设计模式教学课件.ppt

上传人:myk79025 文档编号:5434305 上传时间:2019-03-03 格式:PPT 页数:35 大小:1.23MB
下载 相关 举报
16 设计模式教学课件.ppt_第1页
第1页 / 共35页
16 设计模式教学课件.ppt_第2页
第2页 / 共35页
16 设计模式教学课件.ppt_第3页
第3页 / 共35页
16 设计模式教学课件.ppt_第4页
第4页 / 共35页
16 设计模式教学课件.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、状态(State)模式,状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的逻辑简化。,工作状态,public class Work/钟点private int hour;public int Hourget return hour; set hour = value; /任务完成private bool finish = false;public bool TaskFinishedget return finish; set finish = value; ,public void WriteProgram()

2、if (hour 12)Console.WriteLine(“当前时间:0点 上午工作,精神百倍“, hour);else if (hour 13)Console.WriteLine(“当前时间:0点 饿了,午饭;犯困,午休。“, hour);else if (hour 17)Console.WriteLine(“当前时间:0点 下午状态还不错,继续努力“, hour);,elseif (finish)Console.WriteLine(“当前时间:0点 下班回家了“, hour);elseif (hour 21)Console.WriteLine(“当前时间:0点 加班哦,疲累之极“, ho

3、ur);elseConsole.WriteLine(“当前时间:0点 不行了,睡着了。“, hour);,class Programstatic void Main(string args)/紧急项目Work emergencyProjects = new Work();emergencyProjects.Hour = 9;emergencyProjects.WriteProgram();emergencyProjects.Hour = 10;emergencyProjects.WriteProgram();emergencyProjects.Hour = 12;emergencyProjec

4、ts.WriteProgram();emergencyProjects.Hour = 13;emergencyProjects.WriteProgram();emergencyProjects.Hour = 14;emergencyProjects.WriteProgram();emergencyProjects.Hour = 17;,/emergencyProjects.TaskFinished = true;emergencyProjects.TaskFinished = false;emergencyProjects.WriteProgram();emergencyProjects.Ho

5、ur = 19;emergencyProjects.WriteProgram();emergencyProjects.Hour = 22;emergencyProjects.WriteProgram();Console.Read();,方法过长是坏味道 面向对象设计其实就是希望做到代码的责任分解 上例违背了“单一职责原则”、“开放-封闭原则”,状态模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的逻辑简化。,每个人、事物在不同的

6、状态下会有不同表现(动作),而一个状态又会在不同的表现下 转移到下一个不同的状态(State)。 一个生活中的例子:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过。在出口处也是验票,如果正确你就可以OK,否则就不让你通过。,有限状态自动机(FSM)也是一个典型的状态不同,对输入有不同的响应(状态转移)。 通常我们在实现这类系统会使用到很多的Switch-Case语句或者IfElse语句,Case某种状态,发生某种动作,Case另外一种状态,则发生另外一种动作。但是这种实现方式至少有以下两个问题:,当状态数目不是很多的时候,Switch-Case可能可以搞定。但是当状态数目很多的时候(实

7、际系统中也正是如此),维护一大组的Switch-Case语句将是一件异常困难并且容易出错的事情。 状态逻辑和动作实现没有分离。在很多的系统实现中,动作的实现代码直接写在状态的逻辑当中。这带来的后果就是系统的扩展性和维护得不到保证。,State模式就是被用来解决上面列出的两个问题的,在State模式中我们将状态逻辑和动作实现进行分离。当一个操作中要维护大量的分支语句,并且这些分支依赖于对象的状态。State模式将每一个分支都封装到独立的类中。State模式典型的结构图为:,示例性代码,定义一个接口或抽象类,以封装与Context的一个特定状态相关的行为 abstract class Statep

8、ublic abstract void Handle(Context context);,具体状态,每一个子类实现一个与Context的一个状态相关的行为class ConcreteStateA : Statepublic override void Handle(Context context)context.State = new ConcreteStateB();class ConcreteStateB : Statepublic override void Handle(Context context)context.State = new ConcreteStateA();,Cont

9、ext类,class Contextprivate State state;public Context(State state)this.state = state;public State Stateget return state;setstate = value;Console.WriteLine(“当前状态:“ + state.GetType().Name);public void Request() state.Handle(this);,客户端,class Programstatic void Main(string args)Context c = new Context(ne

10、w ConcreteStateA();c.Request();c.Request();c.Request();c.Request();Console.Read();,工作状态-状态模式版,工作(Context),public class Workprivate State current;public Work()current = new ForenoonState();private double hour;public double Hourget return hour; set hour = value; ,private bool finish = false;public boo

11、l TaskFinishedget return finish; set finish = value; public void SetState(State s)current = s;public void WriteProgram()current.WriteProgram(this);,抽象状态,public abstract class Statepublic abstract void WriteProgram(Work w);,具体状态,public class ForenoonState : Statepublic override void WriteProgram(Work

12、 w)if (w.Hour 12)Console.WriteLine(“当前时间:0点 上午工作,精神百倍“, w.Hour);elsew.SetState(new NoonState();w.WriteProgram();,public class NoonState : Statepublic override void WriteProgram(Work w)if (w.Hour 13)Console.WriteLine(“当前时间:0点 饿了,午饭;犯困,午休。“, w.Hour);elsew.SetState(new AfternoonState();w.WriteProgram()

13、;,public class AfternoonState : Statepublic override void WriteProgram(Work w)if (w.Hour 17)Console.WriteLine(“当前时间:0点 下午状态还不错,继续努力“, w.Hour);elsew.SetState(new EveningState();w.WriteProgram();,public class EveningState : Statepublic override void WriteProgram(Work w)if (w.TaskFinished)w.SetState(ne

14、w RestState();w.WriteProgram();elseif (w.Hour 21)Console.WriteLine(“当前时间:0点 加班哦,疲累之极“, w.Hour);elsew.SetState(new SleepingState();w.WriteProgram();,public class SleepingState : Statepublic override void WriteProgram(Work w)Console.WriteLine(“当前时间:0点 不行了,睡着了。“, w.Hour);public class RestState : Statep

15、ublic override void WriteProgram(Work w)Console.WriteLine(“当前时间:0点 下班回家了“, w.Hour);,class Programstatic void Main(string args)Work emergencyProjects = new Work();emergencyProjects.Hour = 9;emergencyProjects.WriteProgram();emergencyProjects.Hour = 10;emergencyProjects.WriteProgram();emergencyProjects

16、.Hour = 12;emergencyProjects.WriteProgram();emergencyProjects.Hour = 13;emergencyProjects.WriteProgram();emergencyProjects.Hour = 14;emergencyProjects.WriteProgram();emergencyProjects.Hour = 17;,/*如果要员工必须在20点之前离开公司,只需添加下面的“强制下班状态”,并改动 EveningState类的判断就可以了 emergencyProjects.WorkFinished = true;*/emer

17、gencyProjects.TaskFinished = false;emergencyProjects.WriteProgram();emergencyProjects.Hour = 19;emergencyProjects.WriteProgram();emergencyProjects.Hour = 22;emergencyProjects.WriteProgram();Console.Read();,状态模式优点,将与特定状态相关的行为局部化,并且将不同状态的行为分割开来 消除庞大的条件分支语句,把各种状态转移逻辑分布到State的子类之间,减少了相互间的依赖。 显式化进行状态转换:为

18、不同的状态引入独立的对象,使得状态的转换变得更加明确。而且状态对象可以保证上下文不会发生内部状态不一致的状况,因为上下文中只有一个变量来记录状态对象,只要为这一个变量赋值就可以了。,状态模式缺点,State模式问题主要是逻辑分散化,状态逻辑分布到了很多的State的子类中,很难看到整个的状态逻辑图,这也带来了代码的维护问题。,本质,根据状态来分离和选择行为 状态模式是状态驱动,由上下文负责,State模式和Strategy模式简单比较,State模式和Strategy模式有很大程度上的相似:它们都有一个Context类,都是通过委托(组合)给一个具有多个派生类的多态基类实现Context的算法逻辑 两者最大的差别就是State模式中派生类持有指向Context对象的引用,并通过这个引用调用Context中的方法,但在Strategy模式中就没有这种情况。,实例一,在线投票 同一个用户只能投一票 如果一个用户反复投票,而且投票次数超过5次,判定为恶意投票,要取消该用户的投票资格,并取消他所投的票 若超过8次,将进入黑名单,禁止再登录和使用系统。,实例二,工作流中的请假流程 某人提出请假申请,先由项目经理审批,如果项目经理不同意,审批就直接结束 如项目经理同意,再看是否超过3天,如果三天以内,审批直接结束 否则,交给部门经理,部门经理审核后,无论是否同意,审批直接结束,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 中等教育 > 职业教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报