当前位置: 首页 > news >正文

【python设计模式7】行为型模式2

目录

策略模式

模板方法模式


策略模式

定义一个个算法,把它们封装起来,并且使它们可以相互替换。本模式使得算法可独立于使用它的客户而变化。角色有:抽象策略、具体策略和上下文。

from abc import abstractmethod, ABCMeta
from datetime import datetime# 抽象策略
class Strategy(metaclass=ABCMeta):@abstractmethoddef execute(self, data):pass# 具体策略
class FastStrategy(Strategy):def execute(self, data):print("使用较快的策略处理%s" % data)# 具体策略
class SlowStrategy(Strategy):def execute(self, data):print("使用较慢的策略处理%s" % data)# 上下文
class Context:def __init__(self, strategy, data):self.data = dataself.strategy = strategy# 可以定义用户不知道的东西self.date = datetime.now()def set_strategy(self, strategy):self.strategy = strategydef do_strategy(self):self.strategy.execute(self.data)data = "Hello!"
# 使用较快的策略处理
fast_strategy = FastStrategy()
context = Context(fast_strategy, data)
context.do_strategy()
# 使用较慢的策略处理
slow_strategy = SlowStrategy()
context = Context(slow_strategy, data)
context.do_strategy()
"""
使用较快的策略处理Hello!
使用较慢的策略处理Hello!
"""

优点:定义了一些列可重用的算法和行为;消除了一些条件语句;可以提供相同行为的不同实现;缺点:客户必须了解不同的策略。

模板方法模式

内容:定义一个操作中的算法骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。使用模板方法,需要用到两种角色,分别是抽象类和具体类。抽象类的作用是是定义抽象类(钩子操作),实现一个模板方法作为算法的骨架。具体类的作用实现原子操作。

from abc import ABCMeta, abstractmethod
from time import sleep# 抽象类
class Window(metaclass=ABCMeta):@abstractmethoddef start(self):  # 原子操作/钩子操作pass@abstractmethoddef repaint(self):  # 原子操作/钩子操作pass@abstractmethoddef stop(self):  # 原子操作/钩子操作passdef run(self):"""模板方法(具体方法),这个大逻辑就不需要自己写了:return:"""self.start()while True:try:self.repaint()sleep(1)except KeyboardInterrupt:breakself.stop()# 具体类
class MyWindow(Window):def __init__(self, msg):self.msg = msgdef start(self):print('窗口开始运行!')def stop(self):print('窗口停止运行!')def repaint(self):print(self.msg)MyWindow("Hello...").run()

  模板方法适用的场景:一次性实现一个算法的不变部分,各个子类中的公共行为应该被提取出来并集中到一个公共父类中以避免代码重复;控制子类扩展。

http://www.lryc.cn/news/442829.html

相关文章:

  • 基于PHP的CRM管理系统源码/客户关系管理CRM系统源码/php源码/附安装教程
  • 【乐企】基础版接口代码实现
  • 题目--力扣----各位相加
  • git 如何基于某个分支rebase?
  • 倒序循环(一)
  • Shell篇之编写apache启动脚本
  • 头条|司法部公法局局长访谈:推进高水平公立鉴定机构建设!加快推进司法鉴定立法!
  • 高密原型验证系统解决方案(上篇)
  • 新产品,推出 MLX90372GVS 第三代 Triaxis® 位置传感器 IC,适用于汽车和工业系统(MLX90372GVS-ACE-308)
  • JAVA毕业设计178—基于Java+Springboot+vue的智能家具管理系统(源代码+数据库+万字论文)
  • 掌握 Python 异步上下文管理器
  • 当你问AI“有点烦”
  • 音视频入门基础:AAC专题(3)——AAC的ADTS格式简介
  • 高可用web集群面经:集群搭建、nginx+keepalived高可用、prometheus+zabbix监控、nfs+dns
  • vue3+ts+supermap iclient3d for cesium功能集合
  • 【案例71】配置https之后 IE打不开登陆页面 Uclient没有问题
  • ROS 设置dhcp option 6 多个地址格式
  • Python 二级考试
  • Linux笔记---简单指令
  • 软考无损连接判断
  • 微服务-- Sentinel的使用
  • TS React 项目中使用TypeScript
  • 【JavaEE】IP协议 应用层协议
  • CRM如何助力科技服务机构突破业务瓶颈?
  • 牛啊,GitHub 代理加速图文教程
  • 基于扣子(Coze)打造第一个智能体——个性化对话机器人
  • 算法-深度拷贝链表(138)
  • 【Kubernetes】常见面试题汇总(十四)
  • 灵当CRM系统index.php存在SQL注入漏洞
  • 详解QT元对象系统用法