设计模式十二策略模式:边学边做个生成电子书的工具(python+dart)

247 阅读1分钟

策略模式(Strategy Pattern)

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。 如何解决:将这些算法封装成一个一个的类,任意地替换。

python的两个列子

from abc import ABCMeta, abstractmethod

"""
角色:
    抽象策略(Strategy)
    具体策略(ConcreteStrategy)
    上下文(Context)
"""


# 抽象策略
class Strategy(metaclass=ABCMeta):
    @abstractmethod
    def execute(self, data):
        pass


# 具体策略
class FastStrategy(Strategy):
    def execute(self, data):
        print(f"用时较快的策略{data}")


# 具体策略
class SlowStrategy(Strategy):
    def execute(self, data):
        print(f"用时较慢的策略{data}")


# 上下文
class Context:
    def __init__(self, strategy, data):
        self.strategy = strategy
        self.data = data

    def set_strategy(self, strategy):
        self.strategy = strategy

    def do_strategy(self):
        self.strategy.execute(self.data)


# client
data = "123456"
s1 = FastStrategy()
s2 = SlowStrategy()
context = Context(s1, data)
context.do_strategy()

context.set_strategy(s2)
context.do_strategy()


import types



class People:

    def __init__(self, func=None):
        if func:
            #把方法绑定到类的实例中,此时方法在类实例间不共享
            #python 万物皆对象
            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]]

dart的例子

abstract class Strategy {
  int doOperation(int num1, int num2);
}

///
/// 创建实现接口的实体类
///
class OperationAdd implements Strategy {
  @override
  int doOperation(int num1, int num2) {
    return num1 + num2;
  }
}

class OperationSubstract implements Strategy {
  @override
  int doOperation(int num1, int num2) {
    return num1 - num2;
  }
}

class OperationMultiply implements Strategy {
  @override
  int doOperation(int num1, int num2) {
    return num1 * num2;
  }
}

///
/// 创建 Context 类
///
class Context {
  Strategy _strategy;

  Context(this._strategy);

  int executeStrategy(int num1, int num2) {
    return _strategy.doOperation(num1, num2);
  }
}

main(List<String> args) {
  Context context = new Context(new OperationAdd());
  print("10 + 5 = ${context.executeStrategy(10, 5)}");

  context = new Context(new OperationSubstract());
  print("10 - 5 = ${context.executeStrategy(10, 5)}");

  context = new Context(new OperationMultiply());
  print("10 * 5 = ${context.executeStrategy(10, 5)}");
}