Python版

https://github.com/faif/python-patterns/blob/master/other/hsm/hsm.py

"""
Implementation of the HSM (hierarchical state machine) or
NFSM (nested finite state machine) C++ example from
http://www.eventhelix.com/RealtimeMantra/HierarchicalStateMachine.htm#.VwqLVEL950w
in Python - single source 'message type' for state transition changes
- message type considered, messages (comment) not considered to avoid complexity
""" class UnsupportedMessageType(BaseException):
pass class UnsupportedState(BaseException):
pass class UnsupportedTransition(BaseException):
pass class HierachicalStateMachine(object): def __init__(self):
self._active_state = Active(self) # Unit.Inservice.Active()
self._standby_state = Standby(self) # Unit.Inservice.Standby()
self._suspect_state = Suspect(self) # Unit.OutOfService.Suspect()
self._failed_state = Failed(self) # Unit.OutOfService.Failed()
self._current_state = self._standby_state
self.states = {'active': self._active_state,
'standby': self._standby_state,
'suspect': self._suspect_state,
'failed': self._failed_state}
self.message_types = {'fault trigger': self._current_state.on_fault_trigger,
'switchover': self._current_state.on_switchover,
'diagnostics passed': self._current_state.on_diagnostics_passed,
'diagnostics failed': self._current_state.on_diagnostics_failed,
'operator inservice': self._current_state.on_operator_inservice} def _next_state(self, state):
try:
self._current_state = self.states[state]
except KeyError:
raise UnsupportedState def _send_diagnostics_request(self):
return 'send diagnostic request' def _raise_alarm(self):
return 'raise alarm' def _clear_alarm(self):
return 'clear alarm' def _perform_switchover(self):
return 'perform switchover' def _send_switchover_response(self):
return 'send switchover response' def _send_operator_inservice_response(self):
return 'send operator inservice response' def _send_diagnostics_failure_report(self):
return 'send diagnostics failure report' def _send_diagnostics_pass_report(self):
return 'send diagnostics pass report' def _abort_diagnostics(self):
return 'abort diagnostics' def _check_mate_status(self):
return 'check mate status' def on_message(self, message_type): # message ignored
if message_type in self.message_types.keys():
self.message_types[message_type]()
else:
raise UnsupportedMessageType class Unit(object): def __init__(self, HierachicalStateMachine):
self.hsm = HierachicalStateMachine def on_switchover(self):
raise UnsupportedTransition def on_fault_trigger(self):
raise UnsupportedTransition def on_diagnostics_failed(self):
raise UnsupportedTransition def on_diagnostics_passed(self):
raise UnsupportedTransition def on_operator_inservice(self):
raise UnsupportedTransition class Inservice(Unit): def __init__(self, HierachicalStateMachine):
self._hsm = HierachicalStateMachine def on_fault_trigger(self):
self._hsm._next_state('suspect')
self._hsm._send_diagnostics_request()
self._hsm._raise_alarm() def on_switchover(self):
self._hsm._perform_switchover()
self._hsm._check_mate_status()
self._hsm._send_switchover_response() class Active(Inservice): def __init__(self, HierachicalStateMachine):
self._hsm = HierachicalStateMachine def on_fault_trigger(self):
super(Active, self).perform_switchover()
super(Active, self).on_fault_trigger() def on_switchover(self):
self._hsm.on_switchover() # message ignored
self._hsm.next_state('standby') class Standby(Inservice): def __init__(self, HierachicalStateMachine):
self._hsm = HierachicalStateMachine def on_switchover(self):
super(Standby, self).on_switchover() #message ignored
self._hsm._next_state('active') class OutOfService(Unit): def __init__(self, HierachicalStateMachine):
self._hsm = HierachicalStateMachine def on_operator_inservice(self):
self._hsm.on_switchover() # message ignored
self._hsm.send_operator_inservice_response()
self._hsm.next_state('suspect') class Suspect(OutOfService): def __init__(self, HierachicalStateMachine):
self._hsm = HierachicalStateMachine def on_diagnostics_failed(self):
super(Suspect, self).send_diagnostics_failure_report()
super(Suspect, self).next_state('failed') def on_diagnostics_passed(self):
super(Suspect, self).send_diagnostics_pass_report()
super(Suspect, self).clear_alarm() # loss of redundancy alarm
super(Suspect, self).next_state('standby') def on_operator_inservice(self):
super(Suspect, self).abort_diagnostics()
super(Suspect, self).on_operator_inservice() # message ignored class Failed(OutOfService):
'''No need to override any method.''' def __init__(self, HierachicalStateMachine):
self._hsm = HierachicalStateMachine

Python转载版

【编程思想】【设计模式】【其他模式】hsm的更多相关文章

  1. 面向对象编程思想(前传)--你必须知道的javascript

    在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 ...

  2. 面向对象编程思想(前传)--你必须知道的javascript(转载)

    原文地址:http://www.cnblogs.com/zhaopei/p/6623460.html阅读目录   什么是鸭子类型 javascript的面向对象 封装 继承 多态 原型 this指向 ...

  3. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  4. PHP设计模式-策略模式 转

    策略模式(Strategy Pattern) 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个 ...

  5. .NET设计模式: 工厂模式

    .NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html   .NET设计模式(1): ...

  6. 面向对象编程思想(OOP)

    本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...

  7. java编程思想

    Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...

  8. 设计模式 --迭代器模式(Iterator)

    能够游走于聚合内的每一个元素,同时还可以提供多种不同的遍历方式.   基本概念: 就是提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示.   使用迭代器模式的优点: 遍历集合或者数 ...

  9. Java编程思想总结笔记The first chapter

    总觉得书中太啰嗦,看完总结后方便日后回忆,本想偷懒网上找别人的总结,无奈找不到好的,只好自食其力,尽量总结得最好. 第一章  对象导论 看到对象导论觉得这本书 目录: 1.1 抽象过程1.2 每个对象 ...

  10. javascript设计模式——组合模式

    前面的话 在程序设计中,有一些和“事物是由相似的子事物构成”类似的思想.组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的.本文将详细介绍组合模式 宏命令 宏 ...

随机推荐

  1. adb 安装与使用(一)

    一.ADB简介 1. 什么是adb? adb(Android Debug Bridage)是Android sdk的一个工具: adb 是用来连接安卓手机和PC端的桥梁,要有adb作为二者之间的维系, ...

  2. mysql登录遇到ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    执行mysql  -uroot  -p,出现如下问题 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using pass ...

  3. 地表最强IDE ——Visual Studio 2022正式发布

    地表最强IDE--Visual Studio 2022昨天正式发布啦! 堪称宇宙第一IDE工具集的Visual Studio,在经过不断更新优化之后,新版本就要与大家见面了.本次新版本发布,有许多令人 ...

  4. 常用的package.json以及React相关

    常用的package.json以及React相关 前言 package.json 的简单介绍 简单版的 package.json 必备属性(name & version) name 字段 ve ...

  5. 【Git 系列】基础知识全集

    Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人员也可以用 Git 来做自己的文档版本管理工具. 一.Git 基础 ...

  6. [atAGC048F]01 Record

    先将这个序列翻转,贪心找到最长的'101010--'的形式的子序列并删除,重复此过程并记这些字符串长度依次为$l_{1},l_{2},...,l_{n}$,若最终还有字符剩余则一定无解 假设$S$中元 ...

  7. [loj3339]美食家

    令$f[i][j]$表示第$i$个时刻走到点$j$的最小时间,暴力的$dp$复杂度为$o(tm)$ 如果没有限制,由于$w\le 5$,记录前5个时刻的状态即可求出当前状态,用矩阵乘法可优化到$o(n ...

  8. [源码解析] PyTorch 分布式(9) ----- DistributedDataParallel 之初始化

    [源码解析] PyTorch 分布式(9) ----- DistributedDataParallel 之初始化 目录 [源码解析] PyTorch 分布式(9) ----- DistributedD ...

  9. Java培训机构如何选择才能避免被骗?

    近年来,随着IT行业的快速崛起,各类互联网人才供不应求,而Java工程师作为目前最为火爆的岗位之一,更是以高薪+高新技术的标签受到了人们的广泛关注.许多年轻人也看到了这个行业的发展前景,决定报名培训机 ...

  10. 洛谷 P6071 『MdOI R1』Treequery(LCA+线段树+主席树)

    题目链接 题意:给出一棵树,有边权,\(m\) 次询问,每次给出三个数 \(p,l,r\),求边集 \(\bigcap\limits_{i=l}^rE(p,i)\) 中所有边的权值和. 其中 \(E( ...