<人人都懂设计模式>-状态模式
同样是水,固态,气态,液态的变化,是由温度引起。
引此为思考状态模式。
from abc import ABCMeta, abstractmethod
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法
"""
version 1.0
class Water:
def __init__(self, state):
self.__temperature = 25
self.__state = state
def set_state(self, state):
self.__state = state
def change_state(self, state):
if self.__state:
print("由 {} 变为 {}".format(self.__state.get_name(), state.get_name()))
else:
print("初始化为{}".format(state.get_name()))
self.__state = state
def get_temperature(self):
return self.__temperature
def set_temperature(self, temperature):
self.__temperature = temperature
if self.__temperature <= 0:
self.change_state(SolidState("固态"))
elif self.__temperature <= 100:
self.change_state(LiquidState("液态"))
else:
self.change_state(GaseousState("气态"))
def rise_temperature(self, step):
self.set_temperature(self.__temperature + step)
def reduce_temperature(self, step):
self.set_temperature(self.__temperature - step)
def behavior(self):
self.__state.behavior(self)
class State:
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
@abstractmethod
def behavior(self, water):
pass
class SolidState(State):
def __init__(self, name):
super().__init__(name)
def behavior(self, water):
print("当前体温: {}".format(str(water.get_temperature())))
class LiquidState(State):
def __init__(self, name):
super().__init__(name)
def behavior(self, water):
print("当前体温: {}".format(str(water.get_temperature())))
class GaseousState(State):
def __init__(self, name):
super().__init__(name)
def behavior(self, water):
print("当前体温: {}".format(str(water.get_temperature())))
def test_state():
water = Water(LiquidState("液态"))
water.behavior()
water.set_temperature(-4)
water.behavior()
water.rise_temperature(18)
water.behavior()
water.rise_temperature(110)
water.behavior()
test_state()
"""
# version 2.0
class Context(metaclass=ABCMeta):
def __init__(self):
self.__states = []
self.__cur_state = None
self.__state_info = 0
def add_state(self, state):
if state not in self.__states:
self.__states.append(state)
def change_state(self, state):
if state is None:
return False
if self.__cur_state is None:
print("初始化为: {}".format(state.get_name()))
else:
print("由 {} 变为 {}".format(self.__cur_state.get_name(), state.get_name()))
self.__cur_state = state
self.add_state(state)
return True
def get_state(self):
return self.__cur_state
def _set_state_info(self, state_info):
self.__state_info = state_info
for state in self.__states:
if state.is_match(state_info):
self.change_state(state)
def _get_state_info(self):
return self.__state_info
class State:
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
def is_match(self, state_info):
return False
@abstractmethod
def behavior(self, context):
pass
class Water(Context):
def __init__(self):
super().__init__()
self.add_state(SolidState("固态"))
self.add_state(LiquidState("液态"))
self.add_state(GaseousState("气态"))
self.set_temperature(25)
def get_temperature(self):
return self._get_state_info()
def set_temperature(self, temperature):
self._set_state_info(temperature)
def rise_temperature(self, step):
self.set_temperature(self.get_temperature() + step)
def reduce_temperature(self, step):
self.set_temperature(self.get_temperature() - step)
def behavior(self):
state = self.get_state()
if isinstance(state, State):
state.behavior(self)
def singleton(cls, *args, **kwargs):
instance = {}
def __singletone(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return __singletone
@singleton
class SolidState(State):
def __init__(self, name):
super().__init__(name)
def is_match(self, state_info):
return state_info < 0
def behavior(self, context):
print(", 我性格高冷, 当前体温: {}".format(context._get_state_info()))
@singleton
class LiquidState(State):
def __init__(self, name):
super().__init__(name)
def is_match(self, state_info):
return 0 <= state_info < 100
def behavior(self, context):
print("我性格温和, 当前体温: {}".format(context._get_state_info()))
@singleton
class GaseousState(State):
def __init__(self, name):
super().__init__(name)
def is_match(self, state_info):
return state_info >= 100
def behavior(self, context):
print("我性格热烈,当前体温: {}".format(context._get_state_info()))
def test_state():
water = Water()
water.behavior()
water.set_temperature(-4)
water.behavior()
water.rise_temperature(18)
water.behavior()
water.rise_temperature(110)
water.behavior()
test_state()
C:\Python36\python.exe C:/Users/Sahara/PycharmProjects/test/python_search.py 初始化为: 液态 我性格温和, 当前体温: 由 液态 变为 固态 , 我性格高冷, 当前体温: - 由 固态 变为 液态 我性格温和, 当前体温: 由 液态 变为 气态 我性格热烈,当前体温: Process finished with exit code
<人人都懂设计模式>-状态模式的更多相关文章
- <人人都懂设计模式>-中介模式
真正的用房屋中介来作例子, 好的书籍总是让人记忆深刻. class HouseInfo: def __init__(self, area, price, has_window, has_bathroo ...
- <人人都懂设计模式>-单例模式
这个模式,我还是了解的. 书上用了三种不同的方法. class Singleton1: # 单例实现方式1 __instance = None __is_first_init = False def ...
- <人人都懂设计模式>-装饰模式
书上,真的用一个人穿衣打拌来讲解装饰模式的呢. from abc import ABCMeta, abstractmethod class Person(metaclass=ABCMeta): def ...
- 14. 星际争霸之php设计模式--状态模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 人人都懂区块链--pdf电子版学习资料下载
人人都懂区块链 21天从区块链“小白”到资深玩家电子版pdf下载 链接:https://pan.baidu.com/s/1TWxYv4TLa2UtTgU-HqLECQ 提取码:6gy0 好的学习资料需 ...
- [Head First设计模式]生活中学设计模式——状态模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- 深入浅出设计模式——状态模式(State Pattern)
模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...
- 24种设计模式--状态模式【State Pattern】
现在城市发展很快,百万级人口的城市一堆一堆的,那其中有两个东西的发明在城市的发展中起到非常重要的作用:一个是汽车,一个呢是...,猜猜看,是什么?是电梯!汽车让城市可以横向扩展,电梯让城市可以纵向延伸 ...
- C++设计模式——状态模式
前言 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的. typedef enum tagState { state, st ...
随机推荐
- stringstream字符串流的妙用
现在有一个数组,其值为从1到10000的连续增长的数字.出于某次偶然操作,导致这个数组中丢失了某三个元素,同时顺序被打乱,现在需要你用最快的方法找出丢失的这三个元素,并且将这三个元素根据从小到大重新拼 ...
- 显示隐藏文件.reg
显示隐藏文件.reg Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Windows\Curren ...
- inputType导致TextView不能多行显示
今天遇到一个问题很纳闷,那就是TextView不能自动换行多行显示,因为我的印象是TextView默认是可以自动换行多行显示的,今儿个怎么就不行呢. 最终找到原因,是因为设置了inputType属性导 ...
- window环境下的oracle错误error: 0x7e的解决方法
今天连接一个Win2008 Server服务端上的一个oracle出现了下面的这些错误 LoadLibraryFromPath: FQ Dll C:\Windows\system\oci.dll is ...
- C++ 10进制, 16进制, ASCII码, 单字节与多字节的相互转换
这些简单的转换是用的比较频繁的, 因此将这些功能全部封装在一个类中 头文件 #pragma once #include <stdlib.h> #include <string> ...
- FutureTask源码
FutureTask可用于异步获取执行结果或取消执行任务的场景.通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过Fu ...
- 极简 Spring Boot 整合 Thymeleaf 页面模板
虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在做前后端不分的开发,而在前后端不分的开发中,我们就会需要后端页面模板(实际上,即使前后端分离,也会在一些场景下需要使用页面模板, ...
- python 练习题:请利用循环依次对list中的每个名字打印出Hello, xxx!
方法一: # -*- coding: utf-8 -*- # 请利用循环依次对list中的每个名字打印出Hello, xxx! L = ['Bart', 'Lisa', 'Adam'] n = 0 w ...
- ASP.NET MVC 过滤、异常过滤器
记录下过滤器的学习—_— APS.NET MVC中的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前后如果想再加一些额外的逻辑处理,这样会造成大量代码的重复使用,这不是我们希 ...
- .net文件上传的坑记录
传送门:https://www.cnblogs.com/akwwl/p/3573666.html 之前错误:使用layui与web uploader上传文件都报异常,后来终于找到原因是asp.net默 ...