《23 C#设计模式-状态模式.ppt》由会员分享,可在线阅读,更多相关《23 C#设计模式-状态模式.ppt(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、www.ChinaSA.infoDDesign esign P Patternsatterns状态模式状态模式状态模式状态模式刘刘 伟伟(Sunny)weiliu_www.ChinaSA.info大纲w状态模式概述w状态模式的结构与实现w状态模式的应用实例w共享状态w使用环境类实现状态转换w状态模式的优缺点与适用环境www.ChinaSA.info状态模式概述wH2O的三种状态(未考虑临界点)www.ChinaSA.info状态模式概述w分析在软件系统中:在软件系统中:有些对象具有多种状态这些状态在某些情况下能够相互转换对象在不同的状态下将具有不同的行为复杂的复杂的条件判断语句条件判断语句来进
2、行状态的判断和转换操作来进行状态的判断和转换操作 导致代码的可维护性和灵活性下降导致代码的可维护性和灵活性下降 出现新的状态时,出现新的状态时,代码的扩展性很差,客户端代码也需要进行相应的修代码的扩展性很差,客户端代码也需要进行相应的修改,改,违背了开闭原则违背了开闭原则class TestXYZ int behaviour;/Getter and Setter .public void HandleAll()if(behaviour=0)/do something else if(behaviour=1)/do something else if(behaviour=2)/do someth
3、ing else if(behaviour=3)/do something .some more else if.www.ChinaSA.info状态模式概述w状态模式的定义对象行为型对象行为型模式模式状状态态模模式式:允许一个对象在其内内部部状状态态改改变变时时改改变变它它的的行行为为。对对象看起来似乎修改了它的象看起来似乎修改了它的类类。State Pattern:Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.w
4、ww.ChinaSA.info状态模式概述w状态模式的定义又名又名状态对象状态对象(Objects for States)用于解决系统中用于解决系统中复杂对象的状态转换以及不同状态下复杂对象的状态转换以及不同状态下行为的封装问题行为的封装问题将将一个对象的一个对象的状态从该对象中分离状态从该对象中分离出来,封装到专门出来,封装到专门的的状态类状态类中,使得对象状态可以灵活变化中,使得对象状态可以灵活变化对于对于客户端客户端而言,而言,无须关心对象状态的转换以及对象无须关心对象状态的转换以及对象所处的当前状态所处的当前状态,无论对于何种状态的对象,客户端,无论对于何种状态的对象,客户端都可以一致
5、处理都可以一致处理www.ChinaSA.info状态模式的结构与实现w状态模式的结构www.ChinaSA.info状态模式的结构与实现w状态模式的结构状态模式包含以下状态模式包含以下3个角色:个角色:Context(环境类)State(抽象状态类)ConcreteState(具体状态类)www.ChinaSA.info状态模式的结构与实现w状态模式的实现典型的抽象状态类代码:典型的抽象状态类代码:abstract class State /声明抽象业务方法,不同的具体状态类可以有不同的实现 public abstract void Handle();www.ChinaSA.info状态模式
6、的结构与实现w状态模式的实现典型的具体状态类代码:典型的具体状态类代码:class ConcreteState:State public override void Handle()/方法具体实现代码 www.ChinaSA.info状态模式的结构与实现w状态模式的实现典型的环境类代码:典型的环境类代码:class Context private State state;/维维持一个持一个对对抽象状抽象状态对态对象的引用象的引用 private int value;/其他属性其他属性值值,该该属性属性值值的的变变化可能会化可能会导导致致对对象状象状态发态发生生变变化化 /设置状态对象 publ
7、ic void SetState(State state)this.state=state;public void Request()/其他代其他代码码state.Handle();/调调用状用状态对态对象的象的业务业务方法方法/其他代其他代码码 www.ChinaSA.info状态模式的结构与实现w状态模式的实现状态转换的实现:状态转换的实现:(1)统一由环境类来负责状态之间的转换,环境类充当了状态管理器(State Manager)角色 public void ChangeState()/判断属性判断属性值值,根据属性,根据属性值进值进行状行状态转换态转换if(value=0)this.S
8、etState(new ConcreteStateA();else if(value=1)this.SetState(new ConcreteStateB();.www.ChinaSA.info状态模式的结构与实现w状态模式的实现状态转换的实现:状态转换的实现:(2)由具体状态类来负责状态之间的转换,可以在具体状态类的业务方法中判断环境类的某些属性值,再根据情况为环境类设置新的状态对象,实现状态转换 public void ChangeState(Context ctx)/根据根据环环境境对对象中的属性象中的属性值进值进行状行状态转换态转换if(ctx.Value=1)ctx.SetState
9、(new ConcreteStateB();else if(ctx.Value=2)ctx.SetState(new ConcreteStateC();.www.ChinaSA.info状态模式的应用实例w实例说明某软件公司要为一银行开发一套信用卡业务系统,银行账户(Account)是该系统的核心类之一,通过分析,该软件公司开发人员发现在系统中账户存在3种状态,且在不同状态下账户存在不同的行为,具体说明如下:(1)如果账户中余额大于等于0,则账户的状态为正常状态(Normal State),此时用户既可以向该账户存款也可以从该账户取款;(2)如果账户中余额小于0,并且大于-2000,则账户的状
10、态为透支状态(Overdraft State),此时用户既可以向该账户存款也可以从该账户取款,但需要按天计算利息;(3)如果账户中余额等于-2000,那么账户的状态为受限状态(Restricted State),此时用户只能向该账户存款,不能再从中取款,同时也将按天计算利息;(4)根据余额的不同,以上3种状态可发生相互转换。现使用状态模式设计并实现银行账户状态的转换。www.ChinaSA.info状态模式的应用实例w实例分析与类图银行账户状态图银行账户状态图www.ChinaSA.info状态模式的应用实例w实例分析与类图银行账户结构图银行账户结构图www.ChinaSA.info状态模式的
11、应用实例w实例代码(1)Account:银行账户,充当环境类:银行账户,充当环境类(2)AccountState:账户状态类,充当抽象状态类:账户状态类,充当抽象状态类(3)NormalState:正常状态类,充当具体状态类:正常状态类,充当具体状态类(4)OverdraftState:透支状态类,充当具体状态类:透支状态类,充当具体状态类(5)RestrictedState:受限状态类,充当具体状态类:受限状态类,充当具体状态类(6)Program:客户端测试类:客户端测试类演示演示演示演示参考代码参考代码(DesignPatternStateSample)www.ChinaSA.info状
12、态模式的应用实例w结果及分析3次取款操作有不同的结果次取款操作有不同的结果www.ChinaSA.info共享状态w动机在有些情况下,在有些情况下,多个环境对象可能需要共享同一个状多个环境对象可能需要共享同一个状态态如果希望在系统中实现多个环境对象共享一个或多个如果希望在系统中实现多个环境对象共享一个或多个状态对象,那么需要状态对象,那么需要将这些状态对象定义为环境类的将这些状态对象定义为环境类的静态成员对象静态成员对象www.ChinaSA.info共享状态w实例某系统要求两个开关对象要么都处于开的状态,要么都处于关的状态,在使用时它们的状态必须保持一致,开关可以由开转换到关,也可以由关转换
13、到开。试使用状态模式来实现开关的设计。www.ChinaSA.info共享状态w结构开关及其状态设计结构图开关及其状态设计结构图www.ChinaSA.info共享状态w实现开关类:开关类:Switch(环境类)(环境类)抽象状态类:抽象状态类:SwitchState打开状态类:打开状态类:OnState(具体状态类)(具体状态类)关闭状态类:关闭状态类:OffState(具体状态类)(具体状态类)客户端测试类:客户端测试类:Program演示演示演示演示参考代码参考代码(DesignPatternSwitchStateSample)www.ChinaSA.info使用环境类实现状态转换w动机
14、对于对于客户端客户端而言,而言,无须关心状态类无须关心状态类,可以为环境类设,可以为环境类设置默认的状态类,将状态的转换工作交给环境类(或置默认的状态类,将状态的转换工作交给环境类(或具体状态类)来完成,具体状态类)来完成,具体的转换细节对于客户端而具体的转换细节对于客户端而言是透明的言是透明的可以通过可以通过环境类环境类来来实现状态转换实现状态转换,环境类作为一个,环境类作为一个状状态管理器态管理器,统一实现各种状态之间的转换操作,统一实现各种状态之间的转换操作www.ChinaSA.info使用环境类实现状态转换w实例现要开发一个屏幕放大镜工具,其具体功能描述如下:用户单击“放大镜”按钮之
15、后屏幕将放大一倍,再单击一次“放大镜”按钮屏幕再放大一倍,第三次单击该按钮后屏幕将还原到默认大小。试使用状态模式来设计该屏幕放大镜工具。www.ChinaSA.info使用环境类实现状态转换w结构屏幕放大镜工具结构图屏幕放大镜工具结构图www.ChinaSA.info使用环境类实现状态转换w实现屏幕类:屏幕类:Screen(环境类)(环境类)抽象状态类:抽象状态类:ScreenState正常状态类:正常状态类:NormalState(具体状态类)(具体状态类)二倍状态类:二倍状态类:LargerState(具体状态类)(具体状态类)四倍状态类:四倍状态类:LargestState(具体状态类)
16、(具体状态类)客户端测试类:客户端测试类:Program演示演示演示演示参考代码参考代码(DesignPatternScreenStateSample)www.ChinaSA.info状态模式的优缺点与适用环境w模式优点封装了状态的转换规则封装了状态的转换规则,可以对状态转换代码进,可以对状态转换代码进行行集中管理集中管理,而不是分散在一个个业务方法中,而不是分散在一个个业务方法中将所有与某个状态有关的行为放到一个类中将所有与某个状态有关的行为放到一个类中,只,只需要注入一个不同的状态对象即可使环境对象拥需要注入一个不同的状态对象即可使环境对象拥有不同的行为有不同的行为允许状态转换逻辑与状态对
17、象合成一体,而不是允许状态转换逻辑与状态对象合成一体,而不是提供一个巨大的条件语句块提供一个巨大的条件语句块,可以避免使用庞大,可以避免使用庞大的条件语句来将业务方法和状态转换代码交织在的条件语句来将业务方法和状态转换代码交织在一起一起可以让多个环境对象可以让多个环境对象共享一个状态对象共享一个状态对象,从而,从而减减少系统中对象的个数少系统中对象的个数www.ChinaSA.info状态模式的优缺点与适用环境w模式缺点会会增加系统中类和对象的个数增加系统中类和对象的个数,导致系统运导致系统运行开销增大行开销增大结构与实现都较为复杂,结构与实现都较为复杂,如果使用不当将导如果使用不当将导致程序
18、结构和代码混乱,增加系统设计的难致程序结构和代码混乱,增加系统设计的难度度对开闭原则的支持并不太好对开闭原则的支持并不太好,增加新的状态,增加新的状态类需要修改负责状态转换的源代码,否则无类需要修改负责状态转换的源代码,否则无法转换到新增状态;而且修改某个状态类的法转换到新增状态;而且修改某个状态类的行为也需要修改对应类的源代码行为也需要修改对应类的源代码www.ChinaSA.info状态模式的优缺点与适用环境w模式适用环境对象的对象的行为依赖于行为依赖于它的它的状态状态(例如某些(例如某些属性值),属性值),状态的改变将导致行为的变状态的改变将导致行为的变化化在代码中包含大量与对象状态有关的条在代码中包含大量与对象状态有关的条件语句件语句,这些条件语句的出现会导致代,这些条件语句的出现会导致代码的可维护性和灵活性变差,不能方便码的可维护性和灵活性变差,不能方便地增加和删除状态,并且导致客户类与地增加和删除状态,并且导致客户类与类库之间的耦合增强类库之间的耦合增强www.ChinaSA.infoENDEND