ImageVerifierCode 换一换
格式:PPT , 页数:35 ,大小:1.23MB ,
资源ID:5434305      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-5434305.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(16 设计模式教学课件.ppt)为本站会员(myk79025)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

16 设计模式教学课件.ppt

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营业执照举报