




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
注:文档内容基本上来自于网上,并加上自己的理解而成。有的觉得网友总结得非常好,就完全照搬下来,供学习之用。然而,有的摘抄并没有加上原链接和出处,请谅解。设计模式学习笔记-状态模式1. 概述当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。2. 解决的问题主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。3. 模式中的角色3.1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。3.2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。3.3 具体状态(Concrete State):实现抽象状态定义的接口。4. 模式解读4.1 状态模式的类图4.2 状态模式的代码实现 / / Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。 / public class Context private State state; / / 定义Context的初始状态 / / public Context(State state) this.state = state; / / 可读写的状态属性,用于读取和设置新状态 / public State State get return state; set state = value; / / 对请求做处理,并设置下一个状态 / public void Request() state.Handle(this); / / 抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为 / public abstract class State public abstract void Handle(Context context); / / 具体状态类,每一个子类实现一个与Context的一个状态相关的行为 / public class ConcreteStateA : State / / 设置ConcreteStateA的下一个状态是ConcreteStateB / / public override void Handle(Context context) Console.WriteLine(当前状态是 A.); context.State = new ConcreteStateB(); public class ConcreteStateB : State / / 设置ConcreteStateB的下一个状态是ConcreteSateA / / public override void Handle(Context context) Console.WriteLine(当前状态是 B.); context.State = new ConcreteStateA(); 4.3 客户端调用 class Program static void Main(string args) / 设置Context的初始状态为ConcreteStateA Context context = new Context(new ConcreteStateA(); / 不断地进行请求,同时更改状态 context.Request(); context.Request(); context.Request(); context.Request(); Console.Read(); 运行结果5. 模式总结5.1 优点5.1.1状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。5.1.2 所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。5.1.3状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。5.2 缺点5.2.1导致较多的ConcreteState子类5.3 适用场景5.3.1 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式来。5.3.2 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态。6. 应用举例:电灯有两个状态,开(亮)与关(不亮),下面就用状态模式来实现对电灯的控制。6.1 类图6.2 实现代码 / / 电灯类,对应模式中的Context类 / public class Light private LightState state; public Light(LightState state) this.state = state; / / 按下电灯开关 / public void PressSwich() state.PressSwich(this); public LightState State get return state; set state = value; / / 抽象的电灯状态类,相当于State类 / public abstract class LightState public abstract void PressSwich(Light light); / / 具体状态类, 开 / public class On : LightState / / 在开状态下,按下开关则切换到关的状态。 / / public override void PressSwich(Light light) Console.WriteLine(Turn off the light.); light.State = new Off(); / / 具体状态类,关 / public class Off: LightState / / 在关状态下,按下开关则打开电灯。 / / public override void PressSwich(Light light) Console.WriteLine(Turn on the light.); light.State = new On(); 6.3 客户端代码 class Program static void Main(string args) /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年人教版八年级英语上册Unit4 Section B(含答案解析)
- 小班田径课题题目及答案
- 消极社会现象题目及答案
- 2025网约车司机劳动合同书模板范本
- 现代生产管理题目及答案
- 2025年注册消防工程师资格证考试题库
- 2025年投资连结保险合同产生的资产知识点
- 2025合同管理台账模板
- 2025金融服务中介机构银行贷款业务合同
- 2025年有色金属分选机合作协议书
- 《公路桥梁施工监控技术规程》(JTGT3650-01-2022)
- 血气分析标本采集及结果判读
- 科技园区建设规划
- 2024广西公需课高质量共建“一带一路”谱写人类命运共同体新篇章答案
- 家长会课件:小学一年级家长会
- 客舱安全与应急处置(含活页实训手册) 课件 模块四 客舱失火处置
- GB/T 43677-2024生态系统评估陆地生态资产核算技术指南
- 儿童及青少年知情同意书版本
- 中国创伤骨科病人围手术期静脉血栓栓塞症预防指南护理课件
- 《内科胸腔镜术》课件
- 大学美育(第二版) 课件 第一单元:诗意的栖居
评论
0/150
提交评论