美文网首页
python 实现策略模式

python 实现策略模式

作者: 逐风细雨 | 来源:发表于2021-10-21 17:51 被阅读0次

策略模式

   定义一系列算法,把它们一一封装起来,并且使它们之间可以相互替换。此模式让算法的变化不会影响到使用算法的客户。

  • 优点:
    • 算法可以自由切换;
    • 避免使用多重条件判断;
    • 扩展性良好;
  • 缺点:
    • 每个策略都是一个类,复用的可能性很小;
    • 所有策略类都需要对外暴露:调用者得知道有哪些策略
      参考文章
"""
实践策略模式
场景:
    订单数量(orders)不同 每一单的单价不同,单量*单价 = 奖金
规则:
    A orders <500 -> 3
    B 500 <= orders <1000 -> 5
    C orders >=1000 -> 6
"""
from collections import namedtuple

sales = namedtuple("sales", ["name", "orders"])


class Rule:
    """
    规则基类
    """

    @property
    def rule_name(self):
        return ""

    def asert_rule(self, orders):
        pass

    def total(self, orders):
        pass


class RuleA(Rule):
    @property
    def rule_name(self):
        return "RuleA"

    def asert_rule(self, orders):
        return orders < 500

    def total(self, orders):
        return orders * 3


class RuleB(Rule):
    @property
    def rule_name(self):
        return "RuleB"

    def asert_rule(self, orders):
        return 500 <= orders < 1000

    def total(self, orders):
        return orders * 5


class RuleC(Rule):
    @property
    def rule_name(self):
        return "RuleC"

    def asert_rule(self, orders):
        return 1000 <= orders

    def total(self, orders):
        return orders * 6


class SelectRule:


    def __init__(self, sales, rule):
        self.sales = sales
        self.rule = rule

    def execute_rule(self):
        name, orders = self.sales.name, self.sales.orders
        if self.rule.asert_rule(orders):
            money = self.rule.total(orders)
            print(f"姓名{name},单量:{orders},适配的规则:{self.rule.rule_name},奖金:{money}")
            return money
        else:
            print(f"姓名{name},单量:{orders},不适配的规则:{self.rule.rule_name}")
            return ""


class MatchSelectRule:
    """
    遍历规则,匹配合适的规则计算奖金
    """

    def __init__(self):
        self.rules = [
            RuleA(),
            RuleB(),
            RuleC(),
        ]

    def execute_rule(self, sales):
        name, orders = sales.name, sales.orders

        for rule in self.rules:
            if rule.asert_rule(orders):
                print(f"姓名{name},单量:{orders},适配的规则:{rule.rule_name},奖金:{rule.total(orders)}")


if __name__ == "__main__":
    a = sales('a', 400)
    b = sales('b', 800)
    c = sales('c', 1500)

    # 单量小于500 传入规则a
    SelectRule(a, RuleA()).execute_rule()
    # 单量800 传入规则a 提示规则不匹配
    SelectRule(b, RuleA()).execute_rule()
    # 自动选择规则
    RuleMap = MatchSelectRule()
    RuleMap.execute_rule(a)
    RuleMap.execute_rule(b)
    RuleMap.execute_rule(c)

执行结果

image.png

相关文章

  • python 实现策略模式

    策略模式    定义一系列算法,把它们一一封装起来,并且使它们之间可以相互替换。此模式让算法的变化不会影响到使用算...

  • 行为型-Strategy

    策略模式的原理与实现 策略模式的原理与实现策略模式,英文全称是 Strategy Design Pattern。在...

  • 设计模式(python实现)--策略模式(Strategy)

    动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对...

  • 设计模式 | 策略模式及典型应用

    本文的主要内容: 介绍策略模式 示例商场购物打折策略的实现 策略模式总结 源码分析策略模式的典型应用Java Co...

  • 使用策略枚举来代替策略模式

    策略模式实践 举例用策略模式实现加减运算,首先定义抽象策略角色(Strategy接口) 然后定义加减法具体策略角色...

  • 策略模式

    1.策略模式概念 策略模式(Strategy Pattern),实现一个类的行为或其算法可以在运行时更改。策略模式...

  • 使用lambda表达式重构面向对象的设计模式(一)

    策略模式重构 策略模式中的策略在编程中其实就是算法,使用Sttrategy模式可以整体地替换算法的实现部分。能够整...

  • 由if-else,switch代替方案引起的思考

    关键词:条件判断,多态,策略模式,哈希表,字典map作者:码匠信龙 笔者在用python实现事件驱动后,发现pyt...

  • 策略模式

    一 简介 1.定义 策略模式属于对象的行为模式.策略模式能在运行时改变软件的算法行为.如何实现策略模式根据情况而...

  • 策略模式

    类方式实现策略模式 根据不同情况动态选择不同的实例方法 命名元祖实现策略模式 attrgetter有利于函数式编程...

网友评论

      本文标题:python 实现策略模式

      本文链接:https://www.haomeiwen.com/subject/vaafaltx.html