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,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第六个模式--状 ...
随机推荐
- C# format格式对齐
1.24小时时间格式制定 按照2019-12-10-13-00-00格式输出:string dtnow = string.Format("{0:yyyy-MM-dd-HH-mm-ss}&qu ...
- Redis 底层数据结构介绍
Redis 底层数据结构 版本:2.9 支持的数据类型: 字符串 散列 列表 集合 有序集合 字符串 Redis 利用原生的 c 字符串进行了一次封装.封装的字符串叫做简单动态字符串:SDS(simp ...
- C# HttpClient以multipart/form-data形式 提交文件和其它参数
调用文件接口,需要一个上传文件和一个Region参数,参考调用实例 public async Task<WebApiResult> UploadFile(UploadFileModel i ...
- jquery实现商品sku多属性选择(商品详情页)
转载于https://blog.csdn.net/csdn924618338/article/details/51455595 实现效果 源码 <!DOCTYPE HTML> <ht ...
- HTML连载56-网易注册界面实战之全部代码
一.今天完成了网易邮箱注册界面的全部编写,编写一个小小的网页就需要这么多时间来进行设计.测量.排版.编写.测试,才能进行使用,同时编写这个网页复习了几乎前面的所有内容,最后来一个汇总就可以了. < ...
- Sunset: Nightfall Vulnhub Walkthrough
靶机链接: https://www.vulnhub.com/entry/sunset-nightfall,355/ 主机扫描: ╰─ nmap -p- -A 10.10.202.162Starting ...
- Android 项目优化(六):项目开发时优化技巧总结
在之前我们讲了很多能够优化 Android 开发项目质量的方案,这些方案更多的是从一些比较专精的方向切入的,阐述的是一些比较重要且独立的优化方案. 本文我们将总结一下在日常开发过程中我们能够使用的一些 ...
- flutter_boot android和flutter源码阅读记录
版本号0.1.54 看源码之前,我先去看下官方文档,对于其源码的设计说明,文中所说的原生都是指android 看完官方文档的说明,我有以下几个疑问 第一个:容器是怎么设计的? 第二个:native和f ...
- Linux 使用grep过滤多个条件及grep常用过滤命令
这篇文章主要介绍了Linux 使用grep筛选多个条件及grep常用过滤命令,需要的朋友可以参考下 cat log.txt | grep 条件: cat log.txt | grep 条件一 | gr ...
- centos7配置Memcached
Memcached是一套分布式的高速缓存系统,用于提升网站访问速度,尤其对于一些大型的.需要频繁访问数据库的网站,访问速度提升效果十分显著. 1.安装memcached yum install mem ...