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

Python与设计模式--策略模式

23种计模式之 前言 +(5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、+(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、+(11)策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 + 设计原则

12-Python与设计模式–策略模式

一、客户消息通知

假设某司维护着一些客户资料,需要在该司有新产品上市或者举行新活动时通知客户。现通知客户的方式有两
种:短信通知、邮件通知。应如何设计该系统的客户通知部分?为解决该问题,我们先构造客户类,
包括客户常用的联系方式和基本信息,同时也包括要发送的内容。
class customer:
    customer_name=""
    snd_way=""
    info=""
    phone=""
    email=""
    def setPhone(self,phone):
        self.phone=phone
    def setEmail(self,mail):
        self.email=mail
    def getPhone(self):
        return self.phone
    def getEmail(self):
        return self.email
    def setInfo(self,info):
        self.info=info
    def setName(self,name):
        self.customer_name=name
    def setBrdWay(self,snd_way):
        self.snd_way=snd_way
    def sndMsg(self):
        self.snd_way.send(self.info)

snd_way向客户发送信息的方式,该方式置为可设,即可根据业务来进行策略的选择。
发送方式构建如下:

class msgSender:
    dst_code=""
    def setCode(self,code):
        self.dst_code=code
    def send(self,info):
        pass
class emailSender(msgSender):
    def send(self,info):
        print "EMAIL_ADDRESS:%s EMAIL:%s"%(self.dst_code,info)
class textSender(msgSender):
    def send(self,info):
        print "TEXT_CODE:%s EMAIL:%s"%(self.dst_code,info)

在业务场景中将发送方式作为策略,根据需求进行发送。

if  __name__=="__main__":
    customer_x=customer()
    customer_x.setName("CUSTOMER_X")
    customer_x.setPhone("10023456789")
    customer_x.setEmail("customer_x@xmail.com")
    customer_x.setInfo("Welcome to our new party!")
    text_sender=textSender()
    text_sender.setCode(customer_x.getPhone())
    customer_x.setBrdWay(text_sender)
    customer_x.sndMsg()
    mail_sender=emailSender()
    mail_sender.setCode(customer_x.getEmail())
    customer_x.setBrdWay(mail_sender)
    customer_x.sndMsg()

结果打印如下:

PHONE_NUMBER:10023456789 TEXT:Welcome to our new party!
EMAIL_ADDRESS:customer_x@xmail.com EMAIL:Welcome to our new party!

二、策略模式

策略模式定义如下:定义一组算法,将每个算法都封装起来,并使他们之间可互换。以上述例子为例,
customer类扮演的角色(Context)直接依赖抽象策略的接口,在具体策略实现类中即可定义个性化的
策略方式,且可以方便替换。

上一节中我们介绍了桥接模式,仔细比较一下桥接模式和策略模式,如果把策略模式的Context设计
成抽象类和实现类的方式,那么策略模式和桥接模式就可以划等号了。从类图看上去,桥接模式比
策略模式多了对一种角色(抽象角色)的抽象。二者结构的高度同构,也只能让我们从使用意图上
去区分两种模式:桥接模式解决抽象角色和实现角色都可以扩展的问题;而策略模式解决算法切换
和扩展的问题。

三、策略模式的优点和应用场景

优点:
1、各个策略可以自由切换:这也是依赖抽象类设计接口的好处之一;
2、减少代码冗余;
3、扩展性优秀,移植方便,使用灵活。

应用场景:
1、算法策略比较经常地需要被替换时,可以使用策略模式。如现在超市前台,会常遇到刷卡、某宝支付、某信支付等方式,就可以参考策略模式。

四、策略模式的缺点

1、项目比较庞大时,策略可能比较多,不便于维护;
2、策略的使用方必须知道有哪些策略,才能决定使用哪一个策略,这与迪米特法则是相违背的。

http://www.kler.cn/news/149732.html

相关文章:

  • Nginx(九) aio sendfile directio 组合使用测试(2)
  • 力扣:185. 部门工资前三高的所有员工(Python3)
  • JavaScript包装类型
  • mysql 中 varchar 和 text 的区别
  • STM32之模数转换器ADC
  • ubuntu22.04系统下载程序和依赖,并拷贝到指定路径下
  • Bypass open_basedir的方法
  • Linux 磁盘挂载
  • PHP调用API接口的方法及实现(一键采集淘宝商品详情数据)
  • 证明E(X+Y) =E(X) + E(Y)
  • Android 单元测试初体验(二)-断言
  • 【mybatis注解实现条件查询】
  • Nginx入门
  • 手写VUE后台管理系统5 - 整合状态管理组件pinia
  • 【批处理常用命令及用法大全】
  • 基于SpringBoot的教师工作量管理系统
  • 【Flutter】graphic图表实现tooltip一段时间后自动隐藏
  • matlab画双坐标图的样式
  • NX二次开发UF_CSYS_create_temp_csys 函数介绍
  • TypeScript 之 Date日期对象
  • 讲述 什么是鸿蒙 为什么需要鸿蒙 为什么要学习鸿蒙
  • 【libGDX】Mesh纹理贴图
  • springboot集成mybatis-plus
  • uniapp 可拖动可吸附悬浮按钮,兼容app,小程序,H5
  • 算法通关村-----数论问题解析
  • P9240 [蓝桥杯 2023 省 B] 冶炼金属(比值问题)
  • 国内划片机行业四大企业之博捷芯:技术驱动,领跑未来
  • 智能优化算法应用:基于回溯搜索算法无线传感器网络(WSN)覆盖优化 - 附代码
  • 每日一练:约瑟夫生者死者小游戏
  • Spring Application Event 在事件驱动设计中的应用