13、策略模式

一、策略模式

策略模式定义如下:定义一组算法,将每个算法都封装起来,并使他们之间可互换。

上一节中我们介绍了桥接模式,二者结构的高度同构,也只能让我们从使用意图上去区分两种模式:桥接模式解决抽象角色和实现角色都可以扩展的问题;而策略模式解决算法切换和扩展的问题。

客户消息通知示例:

假设某司维护着一些客户资料,需要在该司有新产品上市或者举行新活动时通知客户。现通知客户的方式有两种:短信通知、邮件通知。应如何设计该系统的客户通知部分?为解决该问题,我们先构造客户类,包括客户常用的联系方式和基本信息,同时也包括要发送的内容。

class Customer:
    customer_name = ""
    snd_way = ""
    info = ""
    phone = ""
    email = ""
    
    def set_phone(self, phone):
        self.phone = phone
    
    def set_email(self, mail):
        self.email = mail
    
    def get_phone(self):
        return self.phone
    
    def get_email(self):
        return self.email
    
    def set_info(self, info):
        self.info = info
    
    def set_name(self, name):
        self.customer_name = name
    
    def set_brd_way(self, snd_way):
        self.snd_way = snd_way
    
    def snd_msg(self):
        self.snd_way.send(self.info)

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

class MsgSender:
    dst_code = ""

    def set_code(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.set_name("CUSTOMER_X")
    customer_x.set_phone("10023456789")
    customer_x.set_email("customer_x@xmail.com")
    customer_x.set_info("Welcome to our new party!")

    text_sender = TextSender()
    text_sender.set_code(customer_x.get_phone())
    customer_x.set_brd_way(text_sender)
    customer_x.snd_msg()

    mail_sender = EmailSender()
    mail_sender.set_code(customer_x.get_phone())
    customer_x.set_brd_way(mail_sender)
    customer_x.snd_msg()

打印结果如下:

PHONE_NUMBER:10023456789 TEXT:Welcome to our new party!
EMAIL_ADDRESS:customer_x@xmail.com EMAIL:Welcome to our new party!
二、策略模式的优点和应用场景

优点:
1、各个策略可以自由切换:这也是依赖抽象类设计接口的好处之一;
2、减少代码冗余;
3、扩展性优秀,移植方便,使用灵活。
应用场景:
1、算法策略比较经常地需要被替换时,可以使用策略模式。如现在超市前台,会常遇到刷卡、某宝支付、某信支付等方式,就可以参考策略模式。

三、策略模式的缺点

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值