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,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第六个模式--状 ...
随机推荐
- 两个变量值交换的方法总结(js,python)
方法一: 临时变量法 <script> var num1 = 10; var num2 = 20; var temp;//定义临时变量 temp = num1; num1 = num2; ...
- Python 分支、循环、条件与枚举
单行注释:# 注释内容多行注释:''' 注释内容 ''' Python 中有三种控制流语句: if for while 注:Python 中没有 Switch 这种开关语句 if 语句检测条件真, ...
- 人员简历管理系统-毕业设计(包括文档+源代码+答辩PPT)
1.开发环境 开发工具:Microsoft Visual Studio 2010操作系统:Windows7(推荐)或更高版本 数据库:sql server 2000 或者更高版本Web服务器:IIS ...
- 集合框架关于<list接口><map接口>的运用
集合: 集合就是一个容器,他可以存储对象,我们说集合就是一个可变的数组 集合框架特点 1.list和set集合同时实现了collection接口 2.set集合存储唯一,无序的对象. 3.list 存 ...
- 墨者 - X-FORWARDED-FOR注入漏洞实战
X-FORWARDED-FOR 首先,X-Forwarded-For 是一个 HTTP 扩展头部.HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引 ...
- AndroidStudio初识
大家好,欢迎来到下码看花,伟大领袖毛爷爷曾经说过:“ ‘走马看花不如驻马看花,驻马看花不如下马看花.’我希望你们都要下马看花.”,比喻停下来,深入实际,认真调查研究,这就是咱们公众号名字的由来.与君初 ...
- python基础之字符串讲解(下)
7.swapspace 这个命令是让大小写翻转 s = 'qwerQ' s3 = s.swapcase() print(s3) 8.title 每个隔开(特殊字符或者数字)的单词首字母大写 s = ' ...
- linux搭建TFTP服务
1.安装tftp服务和客户端 sudo apt-get install xinetd tftp tftpd 2.配置 vim /etc/xinetd.d/tftp 内容如下: service tftp ...
- Mac VMware Fusion CentOS7配置静态IP
目录 安装CentOS7 配置静态IP 安装CentOS7 这里我们要安装CentOS7 64位,所以选择CentOS7 64位配置 我们点击存储后,vmware会自动帮我们创建一个虚拟机,但是我们还 ...
- Java集合内容
Java的集合类定义在java.util包中,支持泛型,主要提供了3种集合类,包括List,Set和Map.Java集合使用统一的Iterator遍历. 1.List遍历 实现了Iterator接口的 ...