策略模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式相关的知识,希望对你有一定的参考价值。

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

 

 

 

class Strategy(object):
    """
    策略
    """

    def Algorithmlnterface(self):
        pass

class ConcreteStrategyA(Strategy):

    def Algorithmlnterface(self):
        print("做飞机出行")


class ConcreteStrategyB(Strategy):
    
    def Algorithmlnterface(self):
        print("坐高铁出行")

class ConcreteStrategyC(object):
    
    def Algorithmlnterface(self):
        print("做自行车出行")


class Context(object):
    """docstring for Context"""
    def __init__(self, arg):
        self.arg = arg
        
    def set_strategy(self, arg):
        self.arg = arg

    def Contextlnterface(self):
        return self.arg.Algorithmlnterface()


if __name__ == \'__main__\':
    
    context = Context(ConcreteStrategyA())
    context.Contextlnterface()

    #换行的话
    context.set_strategy(ConcreteStrategyN())
    context.Contextlnterface()        
        

 

以上是关于策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现分布式锁(设计模式应用实战)

用于从 cloudkit 检索单列的代码模式/片段

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式