Python笔记:设计模式之状态模式
状态模式可以看做是在运行时改变对象行为的一种方式。状态模式允许对象在其内部状态变化时改变其行为,此时感觉就像对象本身已经改变了一样。
参与者:
- State接口:State基类,定义不同状态共同需要执行的接口。
- ConcreteSate对象:State基类的子类,不同状态的可以在子类接口中实现不同的操作。
- Context对象:客户端需要关注的对象,此对象中维护自身的具体状态对象,当状态改变时,改变的是Context中的状态对象,而Context对象是不需要改变的。
优点:
- 对象的行为是根据运行时对象的状态而定,避免了使用大量的条件判断来改变代码逻辑。
- 状态模式中,更加容易添加新的行为,只需要定义一个额外的状态即可。
- 提高了编码的聚合性,使得属于同种状态的操作被归于一个类中。
缺点:
- 由于状态本身的功能过于单一,可能会创建过多的状态类,导致使用和维护都会变得非常麻烦。
- 对于Context对象,每个状态的引入,都可能需要进行更新,并且每次更新都可能会影响到原来的行为,导致Context对象的维护变得更加困难。
简单示例:
"""
以电饭煲为例,它有三种状态或者说三种功能:煮饭、煮汤、煮粥
指定好电饭煲的状态后,它就开始以对应模式进行工作
"""
from abc import ABCMeta, abstractmethod class CookState(metaclass=ABCMeta):
"""State接口:定义状态对象共有的接口,即需要煮什么"""
@abstractmethod
def cook(self):
pass class CookRice(CookState):
"""ConcreteSate对象:煮饭"""
def cook(self):
print('Cooking rice...') class CookSoup(CookState):
"""ConcreteSate对象:煮汤"""
def cook(self):
print('Cooking soup...') class CookPorridge(CookState):
"""ConcreteSate对象:煮粥"""
def cook(self):
print('Cooking porridge...') class Cooker:
"""Context对象:电饭煲,根据自身状态决定煮什么"""
def __init__(self):
# 定义本身具有的几种状态,或者电饭煲的几种功能
self.states = [CookRice(), CookSoup(), CookPorridge()]
self.state_index = 0 def switch_state(self):
"""切换电饭煲的状态"""
if self.state_index == (len(self.states) - 1):
self.state_index = 0
else:
self.state_index += 1 def start_cook(self):
"""开始工作"""
self.states[self.state_index].cook() if __name__ == '__main__':
cooker = Cooker()
cooker.start_cook()
cooker.switch_state()
cooker.start_cook()
Python笔记:设计模式之状态模式的更多相关文章
- python设计模式之状态模式
python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 折腾Java设计模式之状态模式
原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- js设计模式——5.状态模式
js设计模式——5.状态模式 代码演示 /*js设计模式——状态模式*/ // 状态(红灯,黄灯,绿灯) class State { constructor(color) { this.color = ...
- 设计模式2——状态模式State
参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...
- C#设计模式学习笔记:(18)状态模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8032683.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第六个模式--状 ...
随机推荐
- Web基础了解版05-Servlet
Servlet Servlet? 从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与Web应用相关的一系列接口,是Web应用实现方式的宏观解决方案.而具体的Servlet容器负责提 ...
- 6、UnityConfig实现AOP
需求:我们需要给已经开发好的服务如这里的UserService,添加额外的执行逻辑,但是又不想破坏原有的服务,如:我们需要给UserService添加监控逻辑,监控的目的是看UserService服务 ...
- Nezuko: 1 Vulnhub Walkthrough
下载地址: https://www.vulnhub.com/entry/nezuko-1,352/ 虚拟机启动,设置IP地址DHCP获取 主机发现扫描: 主机层面扫描: ╰─ nmap -p1-655 ...
- iOS----------证书的制作
https://developer.umeng.com/docs/66632/detail/66748#createappid Certificates-> 卫生许可证 identifiers ...
- java8新特性,你有用起来了吗?(精编)
2019年9月19日java13已正式发布,感叹java社区强大,经久不衰.由于国内偏保守,新东西总要放一放,让其他人踩踩坑,等稳定了才会去用.并且企业目的还是赚钱,更不会因为一个新特性去重构代码 ...
- 查看python版本多少位的
正常我们在cmd终端输入python之后,如果有安装python,就会在回车之后出来关于你安装的python版本信息,几版本,多少位的,但是还有一种,像我这样只显示了python版本是3.7.5,并没 ...
- go笔记--rpc和grpc使用
目录 go笔记--rpc和grpc使用 rpc server.go client.go (sync) client.go (async) grpc protoc server.go client.go ...
- C# 面向切面编程 AOP
AOP(Aspect Oriented Programming) 面向切面编程 起源 引言 http://wayfarer.cnblogs.com/articles/241012.html AOP技 ...
- Linux汇总
Linux介绍以及VMware和Centos的安装 linux-VMtools安装 linux-创建/使用快照/克隆(类似windows中备份还原) linux目录结构 linux指令大全(归类整理) ...
- maven 解决jar包冲突及简单使用
maven 解决jar包冲突 1.jar包冲突原因 maven中使用坐标导入jar包时会把与之相关的依赖jar包导入(导入spring-context的jar时就会把spring的整个主体导入) ,而 ...