欢迎来到天天文库
浏览记录
ID:40200766
大小:70.20 KB
页数:6页
时间:2019-07-25
《设计模式总结 - State模式》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、注:文档内容基本上来自于网上,并加上自己的理解而成。有的觉得网友总结得非常好,就完全照搬下来,供学习之用。然而,有的摘抄并没有加上原链接和出处,请谅解。设计模式学习笔记-状态模式1.概述 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。2.解决的问题 主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。3.模式中的角色 3.1上下文环境(Context):它定义了客户程序需要的接口
2、并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的ConcreteState对象来处理。 3.2抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。 3.3具体状态(ConcreteState):实现抽象状态定义的接口。4.模式解读 4.1状态模式的类图 4.2状态模式的代码实现//////Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。///publicclass
3、Context{privateStatestate;//////定义Context的初始状态//////publicContext(Statestate){this.state=state;}//////可读写的状态属性,用于读取和设置新状态///publicStateState{get{returnstate;}set{state=value;}}///4、ry>///对请求做处理,并设置下一个状态///publicvoidRequest(){state.Handle(this);}}//////抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为///publicabstractclassState{publicabstractvoidHandle(Contextcontext);}//////具体状态类,每一个子类实现一个与Context的一个状态相关5、的行为///publicclassConcreteStateA:State{//////设置ConcreteStateA的下一个状态是ConcreteStateB//////publicoverridevoidHandle(Contextcontext){Console.WriteLine("当前状态是A.");context.State=newConcreteStateB();}6、}publicclassConcreteStateB:State{//////设置ConcreteStateB的下一个状态是ConcreteSateA//////publicoverridevoidHandle(Contextcontext){Console.WriteLine("当前状态是B.");context.State=newConcreteStateA();}} 4.3客户端调用class7、Program{staticvoidMain(string[]args){//设置Context的初始状态为ConcreteStateAContextcontext=newContext(newConcreteStateA());//不断地进行请求,同时更改状态context.Request();context.Request();context.Request();context.Request();Console.Read();}} 运行结果 5.模式总结 5.1优点 5.1.18、 状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。 5.1.2所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。 5.1.3 状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。 5.2缺点 5.2.1 导致较多的ConcreteState子类 5.3适用场景 5.3.1当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态
4、ry>///对请求做处理,并设置下一个状态///publicvoidRequest(){state.Handle(this);}}//////抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为///publicabstractclassState{publicabstractvoidHandle(Contextcontext);}//////具体状态类,每一个子类实现一个与Context的一个状态相关
5、的行为///publicclassConcreteStateA:State{//////设置ConcreteStateA的下一个状态是ConcreteStateB//////publicoverridevoidHandle(Contextcontext){Console.WriteLine("当前状态是A.");context.State=newConcreteStateB();}
6、}publicclassConcreteStateB:State{//////设置ConcreteStateB的下一个状态是ConcreteSateA//////publicoverridevoidHandle(Contextcontext){Console.WriteLine("当前状态是B.");context.State=newConcreteStateA();}} 4.3客户端调用class
7、Program{staticvoidMain(string[]args){//设置Context的初始状态为ConcreteStateAContextcontext=newContext(newConcreteStateA());//不断地进行请求,同时更改状态context.Request();context.Request();context.Request();context.Request();Console.Read();}} 运行结果 5.模式总结 5.1优点 5.1.1
8、 状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。 5.1.2所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。 5.1.3 状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。 5.2缺点 5.2.1 导致较多的ConcreteState子类 5.3适用场景 5.3.1当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态
此文档下载收益归作者所有