python设计模式(二十二):策略模式
策略模式,让一个类的行为或其算法可以在运行时更改,策略是让实例化对象动态的更改自身的某些方法使用的是types.MethodType绑定。
说起策略的动态更改方法,就不得不对比一下元类的动态增加方法,元类是类的抽象,它负责一个抽象类创建、实例化,是通过type函数来绑定方法。
假设这样的一个应用场景:一个人旅游,在不同的国家说不通的语言。
示例code:
import types
class People:
def __init__(self, func=None):
if func:
self.speak = types.MethodType(func, self)
def speak(self):
print("说中文")
def speak_english(self):
print('说英语')
def speak_german(self):
print('说德语')
if __name__ == '__main__':
test1 = People()
test2 = People(speak_english)
test3 = People(speak_german)
[func.speak() for func in [test1, test2, test3]]
说中文
说英语
说德语
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python设计模式(二十一):状态模式
状态模式,当对象的内部状态改变的时候,允许对象执行不同的流程,看起来就像改写了一个对象,核心的方法是把复杂状态变化情况下的流程抽象出来,简化复杂情况状态的判断。 我们设计一个应用场景:当状态是CPU使用率,在不同状态下的自动化运维脚本执行不同的操作 示例code: classBase: defexecutor(self,value): self.run(value)classLow(Base): def__init__(self): self.name="较低占用率状态" defrun(self,value): print("当前:{}值:{}".format(self.name,value)) print("无应急情况执行")classLarge(Base): def__init__(self): self.name="较高占用率状态" defrun(self,value): print("当前:{}值:{}".format(self.name,value)) print("发送警报邮件")classStatu: def__init__(self): self.value=0.1 s...
- 下一篇
python五行代码解决滑块验证的缺口距离识别,破解滑块验证
目前网上关于滑块的缺口识别的方法很多,但是都不极简,看起来繁杂,各种算法的都有,有遍历的有二分法的,今天写个最简单,准确率最高的。 直接看代码: defFindPic(target,template): """ 找出图像中最佳匹配位置 :paramtarget:目标即背景图 :paramtemplate:模板即需要找到的图 :return:返回最佳匹配及其最差匹配和对应的坐标 """ target_rgb=cv2.imread(target) target_gray=cv2.cvtColor(target_rgb,cv2.COLOR_BGR2GRAY) template_rgb=cv2.imread(template,0) res=cv2.matchTemplate(target_gray,template_rgb,cv2.TM_CCOEFF_NORMED) value=cv2.minMaxLoc(res) 使用cv2库,先读取背景图,然后夜视化处理(消除噪点),然后读取模板图片,使用cv2自带图片识别找到模板在背景图中的位置,使用minMaxLoc提取出最佳匹配的最大值和最小值,返回...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7