已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 亳州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(b卷)
- 2025年广东省广州市辅警招聘《公安基础知识》真题及答案解析
- 舟山市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(真题汇编)
- 2026年宿州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及参考答案详解
- 三亚市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解参考
- 黑河市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)带答案详解(完整版)
- 2025年高校综合管理岗位试题及答案
- 2025年高危妊娠测试题及答案
- 2026年来宾市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及参考答案详解
- 贵阳市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(b卷)
- 《鸿蒙应用开发项目教程》全套教学课件
- 2025 CSCO CTIT诊疗指南详解
- 法医临床转岗考试题及答案2025版
- 意图识别关键技术问题探讨
- 娱乐场所管理办法西藏
- 个人养老金课件
- 赛力斯深度研究报告:问界爆款引领携手华为筑底中长期发展
- 铝锭加工居间合同协议书
- 沟槽开挖隐蔽工程质量验收记录
- 亲情主题课件
- 碳族元素大学课件
评论
0/150
提交评论