23种设计模式之状态模式

状态模式的定义

定义: 当一个对象内在状态改变时允许其改变行为, 这个对象看起来像改变了其类

通俗的说, 就是一个事物有不同的状态,在不同状态下执行各个方法时有不同的表现, 将每个状态都封装成一个类, 然后通过上下文对象统一管理

其类图如下:

23种设计模式之状态模式

 

其中的三个角色如下:

  1. State 抽象状态角色: 接口或抽象类, 负责对象状态定义, 并且封装环境角色以实现状态切换
  2. ConcreteState 具体状态角色: 每一个具体状态必须完成两个职责: 本状态的行为管理以及趋向状态处理, 通俗的说, 就是本状态下要做的事情, 以及本状态如何过渡到其他状态
  3. Context 环境角色: 定义客户端需要的接口, 并且负责具体状态的切换

抽象状态角色代码:

23种设计模式之状态模式

 

抽象状态中声明一个环境角色, 提供各个状态类自行访问, 并且提供所有状态的抽象行为, 由各个实现类实现

具体状态角色代码:

23种设计模式之状态模式

 

具体状态角色有两个职责: 处理本状态要完成的任务, 决定是否可以过度到其他状态.

环境角色代码:

23种设计模式之状态模式

 

环境角色有两个不成文的约束:

  1. 把状态对象生命为静态常量, 有几个状态对象就声明ji'ge几个静态常量
  2. 环境角色具有状态抽象角色定义的所有行为, 具体执行使用委托方式

场景类代码:

23种设计模式之状态模式

 

这样就实现了在不同状态下的切换

状态模式的应用

状态模式的优点:

  1. 结构清晰. 避免了过多的 switch...case 或者 if...else 语句的使用, 避免了程序的复杂性, 提高系统的可维护性
  2. 遵循设计原则. 很好的体现了开闭原则和单一职责原则, 眉哥哥状态都是一个子类, 你要增加状态就要增加子类, 要修改状态, 只修改一个子类即可
  3. 封装性非常好. 这也是状态模式的基本要求, 状态变换放置到类的内部来实现, 外部的调用不用知道类内部如何实现状态和行为的变换

状态模式的缺点:

状态模式只有一个 缺点, 子类会太多, 也就是类膨胀. 一个事物有很多个状态也不稀奇, 如果完全使用状态模式就会有太多的子类, 不好管理. 其实有很多方式可以解决这个状态问题, 如在数据库中建立一个状态表, 然后根据状态执行相应的操作.

状态模式的使用场景:

  1. 行为随状态改变 而改变的场景.
  2. 条件、分支判断语句的替代者. 在程序中大量使用 seitch 语句或者if 判断语句会导致程序结构不清晰, 逻辑混乱, 使用状态模式可以很好的避免这一问题, 它通过扩展子类实现了条件的判断处理

状态模式适用于当某个对象在它的状态发生改变时, 他的行为也随着发生比较大的变化, 也就是说在行为受状态约束的情况下可以使用状态模式, 而且使用时对象的状态最好不要超过5个

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二维码的纠错码原理及细节

参考文档: https://www.thonky.com/qr-code-tutorial/error-correction-coding 1. 消息多项式 消息多项式的系数组成:数字码字。如“hello world” ,利用二维码的编码原理,转换成十进制数字为“32, 91, 11, 120, 209, 114, 220, 77, 67, 64…

Android 二维码扫码功能实现(Zxing集成,避坑启示)

这两天想要实现一个能扫码的app,找了一下,发现zxing用的比较多,就在网上找了找怎么用zxing。我主要是按照宇宝守护神的博文“Android 二维码的扫码功能实现(一)”的步骤完成的,博文链接在此:htt…

23种设计模式之桥梁模式

桥梁模式的定义 定义: 将抽象和实现解耦, 使得两者可以独立的变化 通俗的说, 就是一个类调用另一个类中的方法, 需要一个桥梁, 通过聚合的关系调用 其类图如下: 其中角色说明如下: Abstraction 抽象化角色: 它的主要职责是定义出该角色的行为, 同时保存一个对实现化角色的引…

23种设计模式之享元模式

享元模式的定义 定义: 使用共享对象可有效的支持大量的细粒度的对象 通俗的说, 就是将类的通用属性抽出来,建立对象池,以达到限制对象数量的效果 上面定义中要求细粒度对象, 那么不可避免的使得对象数量多且性质相近, 我们将这些对象的信息分为两个部分: 内部状态和外部状态…

Ubicomp一些有意思的论文

[Ubicomp2016] ARTcode: Preserve Art and Code In Any Image 主要内容:研究团队来自上海交通大学王新兵老师团队。主要成果是在图片中嵌入信息(不同于现在,在二维码中间放一张小小图片)。方法:给一张图片&#xff0c…

设计模式之创建类模式PK

创建类模式包括: 工厂方法模式建造者模式抽象工厂模式单例模式原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新的对象,这两个不容易混淆. 工厂方法模…

设计模式之结构类模式PK

结构类模式包括: 适配器模式桥梁模式组合模式装饰模式门面模式享元模式代理模式 结构类模式着重于如何建立一个软件结构 为什么叫结构类模式呢? 因为他们都是通过组合类或对象产生更大结构以适应更高层次的逻辑需求. 结构型模式是为解决怎样组装现有的类,设计他…

设计模式之行为类模式PK

行为类模式包括: 责任链模式命令模式解释器模式迭代器模式中介者模式备忘录模式观察者模式状态模式策略模式模板方法模式访问者模式 行为型模式涉及到算法和对象间职责的分配 行为类模式关注如何管理对象的行为. 命令模式VS策略模式 策略模式和命令模式相似, 特别是命令模式…

射频(RF)基本理论:定义、特性、调制、扩频

参考: INTRO TO SDR AND RF SIGNAL ANALYSIS 一文让你读懂调幅、调相、调频、 与 I/Q 调制?它们的区别详解 无线网络技术教程(第二版) 金光、江先亮编 数字调制系列:IQ调制基本理论 1. 什么是射频? …

设计模式之规格模式

规格模式 规格模式 使用了策略模式,组合模式. 只不过将模式具体化了 规格模式将 与或非 操作进行了封装, 实现了类似 SQL查询语句的操作. 类图如下: 其中的角色如下: ISpecification 抽象规格书: 对规格书的抽象定义CompositeSpecification 组合规格书: 抽象类, 对规格书进…

低功耗广域网:关键特性

参考:《从创意到原型:物联网应用快速开发》 董玮 高艺 编著 介绍详细,适合初学无线网络和物联网的童鞋 —————————————————————————————————————— 低功耗广域网(LPWAN) 一.分…

设计模式之雇工模式

雇工模式 雇工模式也叫仆人模式, 其意图为: 雇工模式是行为模式的一种, 它为一组类提供通用的功能,而不需要类实现这些功能,它是命令模式的一种扩展. 其类图如下: 其中角色如下: IServiced : 用于定义服务内容的接口Serviced1 : 具体的服务提供者Servant : 执行者,即雇工类,…

Grove-Lora Radio:修改库函数使能修改扩频因子、带宽参数、码率

Grove-Lora Radio的使用详见:http://wiki.seeedstudio.com/cn/Grove_LoRa_Radio/ 但是网站中提供的Grove_LoRa_433MHz_and_915MHz_RF-master中的示例代码只能修改RF的频率,不能修改LoRa扩频因子、带宽等参数。研究了一下午,终于搞明白怎么修…

设计模式之对象池模式

对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并行处理), 在大多情况下, 指性能) 简单的说, 在需要时,从池中提取,不用时,放回池中,等待…

WiFi的基本调制过程

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 基本的WiFi调制分为以下三个步骤: 1. 将信号调制到正弦波上。 WiFi采用QAM(正交振幅调制),用I/Q信号表示的话&#…

设计模式之黑板模式

黑板模式的意图 黑板模式是观察者模式的一个扩展,知名度并不高,但使用的范围却非常广. 其意图为: 允许消息的读写同时进行, 广泛的交互消息. 简单的说, 黑板模式允许多个消息读写者同时存在, 消息的生产者和消费者完全分开. 这就像一个黑板, 任何一个老师(消息的生产者)都可以…

蓝牙调制

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 《从创意到原型:物联网应用快速开发》 董玮,高艺编著 详解蓝牙标准中的GFSK调制:https://blog.csdn.net/lovehua365/article/detai…

设计模式之空对象模式

空对象模式 空对象模式是通过实现一个默认的无意义对象来避免null值出现, 简单地说,就是为了避免在程序中出现null值判断而诞生的一种常用设计方法. 举个简单的例子, 一个听动物叫声的模拟程序: 动物代码: 听叫声的人: 现在我们想, 能不能把 animal 的空值判断去掉呢?我们增…

树莓派安装mosquitto提示“MOSQ_1.5” not found

由于工作需要,我需要把树莓派上已经安装的mosquitto卸了,然后再安装一个新的。 安装的方法参考下面这个链接: http://www.52pi.net/archives/1718 但是重新安装的过程比较顺利,make install之后也没出现什么问题,但…

UML类图基础说明

UML类图主要由类和关系组成. 类: 什么具有相同特征的对象的抽象, 具体我也记不住, 反正有官方定义 关系: 指各个类之间的关系 类图 类就使用一个方框来表示, 把方框分成几层, 来表示不同的信息,如下图所示: 当然, 类图也不一定每一次都长这样, 比如你只分析各个类之间的关系…