状态设计模式

五种状态设计模式:

  • 终极钩子模式
  • 提醒者模式
  • 延迟事件模式
  • 正交组件模式
  • 转换到历史模式

1.终极钩子模式

俗语:老爸对儿子说,你可以按你的特殊方式去做事,但如果你不做,我会做。

目的:公共的处理功能放到父状态,并可以在子状态中重载,以实现特殊的功能。为什么叫终极钩子,因为如果子状态不处理,总会在父状态中得到处理,是个终极的处理。

问题:父状态提供公共一致的事件处理方式,如在GUI设计中,提供一致的界面样式,为所有的子状态提供默认的一致界面,如果需要,子状态也可以重载默认的事件处理方式。

解决方案:使用差异化编程,公共的事件处理放到父状态中,子状态中重载特殊行为。子状态(specific)中的A事件处理重载了父状态A事件处理,子状态中的A事件处理就是特殊的事件处理。如果某个子状态不处理A,则在父状态中处理A。

图1.终极钩子模式

2.提示器模式

俗语:我闲的时候,你通知我做,我就做;我在做事的时候,你就不能通知我了,等我闲时再说。

目的:产生一个事件,并发送给自身,以使状态图拓扑更加灵活。

问题:在状态建模时,一些相关的功能耦合太强,用提示器模式,可以解耦。如定时查询传感器功能与处理数据功能,当查询到传感器接完数据时,通过发送一个提示事件让处理数据功能进行处理。

图2. 两个功能模块

解决方案:两个功能设计为一个层次状态机结构,查询功能设计到父状态中,处理功能设计到子状态中,用一个提示器事件(DATA_READY),提示处理功能来处理查询传感器的得到的数据。

图3. 提示器模式

可以用提示器模式把一个长任务分解为多个小任务来执行。

3.延迟事件模式

俗语:我很忙,有事我先记下,我闲时,我再按我记下的去做。

目的:通过修改事件的顺序来简化状态机。用于处理事务。

问题: 当前正在处理一个事务时,因事务是原子性的,不可分割的,这时要是来了新的事件,可能会破坏事务处理的原子性。如ATM终端。

解决方案: 在处理事务时,接收事件并保存到本地队列中,当本事务处理完时再从本地队列中召回保存的事件。

图4. 延迟事件模式

4.正交组件模式

俗语:虽然你是你,我是我,但你听我的没错。

目的:把状态机做为一个组件来使用,把原来正交区域的独立关系转化为主-从关系。

问题: 许多对象包含相对独立的具有状态行为的部分,在UML状态图中实现方式是,把这种松散关联的功能放到独立的正交区域,而采用正交区域的解决方法,成本较高。如闹钟的功能实现。

解决方案: 使用对象合成来代替正交区域,把行为独立的两部分分成两个状态机,其中一个包含另一个。正交区域的两个对象,使一个对象成为容器,包含另一个组件对象,由容器对象负责对组件对象的初始化及调用。通过直接向组件派发事件,容器可以主动触发组件初始化和状态转换;而组件是通过发送事件给容器来通知容器的。

图5. 正交组件模式

5.转换到历史模式

俗语: 我在工作中,当有更重要的事时,我马上去做,做完后,我会回到我被中断工作前的状态。

目的:从某个组合状态转换出来时,记住最近的活动子状态,在返回时,还返回到这个活动子状态。

问题:在高层组合状态处理事件时,常常需要处理一些更重要的事件,当处理完时,系统必须返回组合状态最近的子状态。

解决方案: 在组合状态机的属性中加一个状态函数变量xxx_history,在状态机进入某状态时,保存当前状态到这个状态函数变量中。在退出组合状态后返回时,按照保存在状态函数变量值,转换到最后退出组合状态前的状态。

图6.转换到历史模式

参考:
【1】Miro Samek《UML状态图的实用C/C++设计---嵌入式系统的事件驱动型编程技术》第二版

转载于:https://www.cnblogs.com/hyper99/p/zhuang-tai-she-ji-mo-shi.html

内容简介: 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 本课程内容定位学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。本章将详细介绍开闭原则(OCP)、依赖倒置原则(DIP)、单一职责原则(SRP)、接口隔离原则(ISP)、迪米特法则(LoD)、里氏替换原则(LSP)、合成复用原则(CARP)的具体内容。 为什么需要学习这门课程? 你在日常的开发中,会不会也遇到过同样的问题。系统出现问题,不知道问题究竟出在什么位置;当遇到产品需求,总是对代码缝缝补补,不能很快的去解决。而且平时工作中,总喜欢把代码堆在一起,出现问题时,不知道如何下手,工作效率很低,而且自己的能力也得不到提升。而这些都源于一个问题,那就是软件设计没做好。这门课能帮助你很好的认识设计模式,让你的能力得到提升。课程大纲: 为了让大家快速系统了解设计模式知识全貌,我为您总结了思维导图,帮您梳理学习重点,建议收藏!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值