2.设计模式中状态模式(对象的行为模式)(Python实现)
1.什么是状态模式?
2.状态模式的设计思想
3.状态模式的代码框架模型
4.分别用框架模型和不用框架模型来处理下面的例子
5.模型说明
6. 应用场景
1.什么是状态模式?
如水一般,状态即事物所处的某一种形态。状态模式是说一个对象在其内部状态发生改变时,其表现的行为和外在的属性不一样,这个对象看上去就像改变了它的类型一样。因此,状态模式又称为对象的行为模式
2.状态模式的设计思想
水有三种不同的状态,冰、水、水蒸气。三种不同的状态有着完全不一样的外在特性。三种状态也是相差巨大,但其实内部组成都是一样的,都是水分子。
状态模式的核心思想就是一个事物(对象)有多种状态,在不同的状态下所表现出来的行为和属性不一样
3.状态模式的代码框架模型
# 引入 ABCMeta 和 abstractmethod 来定义抽象类和抽象方法 from abc import ABCMeta,abstractmethodclass Context(metaclass=ABCMeta):"""状态模式的上下文环境类"""def __init__(self):self.__states = []self.__curState = None# 状态发生变化依赖的属性,当这一变量由多个变量共同决定时可以将其单独定义成一个类self.__stateInfo = 0def addState(self, state):if state not in self.__states:self.__states.append(state)def changeState(self, state):if state is None:return Falseif self.__curState is None:print("初始化为",state.getName())else:print("由",self.__curState.getName(),"变为",state.getName())self.__curState = stateself.addState(state)return Truedef getState(self):return self.__curStatedef __setStateInfo(self, stateInfo):self.__stateInfo = stateInfofor state in self.__states:if state.isMatch(stateInfo):self.changeState(state)def __getStateInfo(self):return self.__stateInfoclass State:"""状态的基类"""def __init__(self, name):self.__name = namedef getName(self):return self.__namedef isMatch(self, stateInfo):"""状态的属性 stateInfo 是否在当前的状态范围"""return False@abstractmethoddef behavior(self, context):pass
4.分别用框架模型和不用框架模型来处理下面的例子
用水的三种状态,理解状态模式
不管水是什么状态,对象始终是水,所以会有一个 Water类,而它有三种状态,我们可以定义三个状态类,
SolidState、LiquidState、GaseousState; 就单从这三个单词中每个都有个State的后缀,可以抽出一个更抽象的类
这个类就是状态类(State)。
首先不用框架模型
# 引入 ABCMeta 和 abstractmethod 来定义抽象类和抽象方法 from abc import ABCMeta, abstractmethodclass Water:"""水"""def __init__(self, state):self.__temperature = 25 # 默认常温为25℃self.__state = state# 设置状态def setState(self, state):self.__state = state# 改变状态def changeState(self, state):if self.__state:print("由", self.__state.getName(), "变为", state.getName())else:print("初始化为", state.getName())self.__state = state# 获取温度def getTemperature(self):return self.__temperature# 设置温度def setTemperature(self, temperature):self.__temperature = temperatureif self.__temperature <= 0:self.changeState(SolidState("固态"))elif self.__temperature <= 100:self.changeState(LiquidState("液态"))else:self.changeState(GaseousState("气态"))# 提升温度def riseTemperature(self, step):self.setTemperature(self.__temperature + step)# 降低温度def reduceTemperature(self, step):self.setTemperature(self.__temperature - step)# 表现出的形态def behavior(self):self.__state.behavior(self)class State(metaclass=ABCMeta):"""状态的基类"""def __init__(self, name):self.__name = namedef getName(self):return self.__namedef isMatch(self, stateInfo):"""状态的属性 stateInfo 是否在当前的状态范围"""return False@abstractmethoddef behavior(self, water):"""不同状态下的行为"""passclass SolidState(State):"""固态"""def __init__(self, name):super().__init__(name)def behavior(self, water):print("当前的温度" + str(water.getTemperature()) + "℃,为固态冰")class LiquidState(State):"""液态"""def __init__(self, name):super().__init__(name)def behavior(self, water):print("当前的温度" + str(water.getTemperature()) + "℃,为液态水")class GaseousState(State):"""气态"""def __init__(self, name):super().__init__(name)def behavior(self, water):print("当前的温度" + str(water.getTemperature()) + "℃,为气态水蒸气")def testState():water = Water(LiquidState("液态"))water.behavior()water.setTemperature(-4)water.behavior()water.riseTemperature(18)water.behavior()water.riseTemperature(110)water.behavior()testState()
首先设置状态为液态,然后调用behavior()方法,看表现的状态,再进行设置温度,以及提升温度,看它不同的温度所表现的状态
运行结果:
State是抽象状态类(基类),负责状态的定义和接口的统一。
使用框架模式,
# 引入 ABCMeta 和 abstractmethod 来定义抽象类和抽象方法 from abc import ABCMeta, abstractmethodclass Context(metaclass=ABCMeta):"""状态模式的上下文环境类"""def __init__(self):self.__states = []self.__curState = Noneself.__stateInfo = None# 状态发生变化依赖的属性,当这一变量由多个变量共同决定时可以将其单独定义成一个类self._stateInfo = 0def addState(self, state):if state not in self.__states:self.__states.append(state)def changeState(self, state):if state is None:return Falseif self.__curState is None:print("初始化为", state.getName())else:print("由", self.__curState.getName(), "变为", state.getName())self.__curState = stateself.addState(state)return Truedef getState(self):return self.__curStatedef setStateInfo(self, stateInfo):self.__stateInfo = stateInfofor state in self.__states:if state.isMatch(stateInfo):self.changeState(state)def getStateInfo(self):return self.__stateInfoclass Water(Context):"""水"""def __init__(self):super().__init__()# 添加三种状态self.addState(SolidState("固态"))self.addState(LiquidState("液态"))self.addState(GaseousState("气态"))# 设置温度self.setTemperature(25)def getTemperature(self):return self.getStateInfo()def setTemperature(self, temperature):self.setStateInfo(temperature)def riseTemperature(self, step):self.setTemperature(self.getTemperature() + step)def reduceTemperature(self, step):self.setTemperature(self.getTemperature() - step)def behavior(self):# 获取状态state = self.getState()if isinstance(state, State):state.behavior(self)# 单例的装饰器 def singleton(cls, *args, **kwargs):"""构造一个单例的装饰器"""instance = {}def _singleton(*args, **kwargs):if cls not in instance:instance[cls] = cls(*args, **kwargs)return instance[cls]return _singletonclass State(metaclass=ABCMeta):"""状态的基类"""def __init__(self, name):self.__name = namedef getName(self):return self.__namedef isMatch(self, stateInfo):"""状态的属性 stateInfo 是否在当前的状态范围"""return False@abstractmethoddef behavior(self, water):"""不同状态下的行为"""pass@singleton class SolidState(State):"""固态"""def __init__(self, name):super().__init__(name)def isMatch(self, stateInfo):return stateInfo < 0def behavior(self, context):print("当前的温度" + str(context.getStateInfo()) + "℃,为固态冰")class LiquidState(State):"""液态"""def __init__(self, name):super().__init__(name)def isMatch(self, stateInfo):return 0 <= stateInfo < 100def behavior(self, context):print("当前的温度" + str(context.getStateInfo()) + "℃,为液态水")class GaseousState(State):"""气态"""def __init__(self, name):super().__init__(name)# 当温度大于100,即为气态,范围truedef isMatch(self, stateInfo):return stateInfo >= 100def behavior(self, context):print("当前的温度" + str(context.getStateInfo()) + "℃,为气态水蒸气")def testState():water = Water()water.behavior()water.setTemperature(-4) # 设置温度water.behavior()water.riseTemperature(18) # 提升温度18℃water.behavior()water.riseTemperature(110) # 提升温度110℃water.behavior()testState()
运行结果:
5.模型说明
- 设计要点 在实现状态模式的时候,实现的场景状态有时候会非常复杂,决定状态变化的因素也非常多,我们可以把决定状态变化的属性单独抽象成一个类StateInfo,这样判断状态属性是否符合当前的状态isMatch时,就可以传入更多的信息。
每一种状态应当只有唯一的实例。- 状态模式的优缺点
(1)优点:
①封装了状态的转换规则,在状态模式中可以将状态的转换代码封装在环境类中,对状态转换代码进行集中管理,而不是分散在一个个业务逻辑中。
②将所有的与某个状态有关的行为放到一个类中(称为状态类),使开发人员只专注于该状态下的逻辑开发。
③允许状态转换逻辑与状态对象合为一体,使用时只需要注入一个不同的状态对象即可,使环境对象拥有不同的行为
(2)缺点:
①会增加系统类和对象的个数
② 状态模式的结构与实现都较为复杂,如果使用不当容易导致 程序结构和代码的混乱6. 应用场景
(1) 一个对象的行为取决于它的状态,并且它在运行时可能经常改变它的状态,从而改变它的行为。
(2)一个操作中含有庞大的多分支的条件语句,这些分支依赖于该对象的状态,且每一个分支的业务逻辑都非常复杂时,
我们可以使用状态模式来拆分不同的分支逻辑,使程序有更好的可读性和可维护性。
2.设计模式中状态模式(对象的行为模式)(Python实现)相关推荐
- State(状态)--对象行为型模式
State(状态)–对象行为型模式 一.意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 二.动机 1.在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化 ...
- Proxy 代理模式 对象结构型模式
1.意图 为其它对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate 3.动机 对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化.我们考虑一个 ...
- 查询oracle模式对象信息,ORACLE 模式和模式对象
模式和模式对象一个模式(schema)为模式对象(scehma object)的一个集合,每一个数据库用户对应一个模式.模式对象为直接引用数据库数据的逻辑结构,模式对象包含如表.视图.索引.聚集.序列 ...
- 23种设计模式中的蝇量(享元)模式
蝇量(享元)模式:通过共享的方式高效地支持大量细粒度的对象. 个人见解:实际上是在做大量for循环时,没必要将这些数据封装成一个对象,直接将对象的方法抽象出来,直接调用(静态),是一个优化的过程,,节 ...
- Bridge模式——对象结构型模式
今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...
- python中可迭代对象_什么是python中的可迭代对象(iterable object)?
我们经常在打印报错信息中和英文的文档中看到iter这个词根,可以组合成iterable/iterate等派生词.这个iter可以翻译成"迭代",这样iterable object的 ...
- 详解设计模式:状态模式
状态模式(State Pattern)也被称为状态机模式(State Machine Pattern),是在 GoF 23 种设计模式中定义了的行为型模式. 在状态模式 类的行为是基于它的状态改变的. ...
- 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)
结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...
- C++ 设计模式之Static Factory模式(简单工厂模式)
简单工厂模式并不是GOF提出的23种设计模式中的一种.工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品. 适用场合 1.在程序中,需要创建的对象很多,导致对象的 ...
最新文章
- 存储过程和存储函数初步
- 放大招了,送一波来自 Facebook、Google、网易、阿里的学习福利!
- 【Java集合系列四】HashSet和LinkedHashSet解析
- 问卷星作答能不能检测到屏幕共享_云端检测,别样精彩——大厂回族自治县王必屯中心小学线上期末检测纪实...
- CPU缓存和内存屏障
- hive安装测试及Hive 元数据的三种存储方式
- 您的框架有多可扩展性?
- VUE3封装axios网络请求
- 我的软件开发生涯 (10年开发经验总结和爆栈人生)
- 2020年下半年系统集成项目管理工程师上午试题解析(三)
- JSONObject.fromObject()
- linux能运行关关采集器吗,杰奇linux采集器,基本能用且速度还行
- html公历农历相互转换,JavaScript实现公历转换农历
- LOMO+XQDA(2015CVPR)
- 5种经典程序化日内交易策略
- Windows内存 之 任务管理器
- 坦然的面对一切都已经发生的事实
- el-tree 默认展开第一级节点
- 聚类分析:原型K-Means/K-Means++聚类、层次聚类;密度聚类DBSCAN
- React-Native组件之 Navigator和NavigatorIOS