最近工作中需要写一个功能跟据不同的条件对数据进行筛选。如果用传统的方式需要写很多的if else 语句,这样会导致后期如果再增加新的条件时需要增加更多的分支,使代码很难维护。
但是使用策略模式就会简便很多。在策略模式(Strategy Pattern)中, 一个Class的行为或算法在运行时可以得到改变。策略模式来自于Behavior Pattern.
在策略模式中的strategy objects代表了不同的策略, 而context object因为它的策略也会有不同的行为。策略class会改变context class在运行时的算法。
下面我会用Python实现一下策略模式。
我会先定义一个Strategy Interface (Operator), 去规定一个行为, 再定义4个Concrete Stratety Classes(Add, Substract, Multiply, Divid)去执行Strategy Interface. 最后定义Context class (Context)去使用这些策略。
# 策略接口
class Operator:
def __init__(self, *args, **kwargs):
self.num1 = args[0]
self.num2 = args[1]
def doOperator(self):
pass
# 具体的策略实现类。 做加法运算
class Add(Operator):
def __init__(self, *args, **kwargs):
super(Add, self).__init__(*args, **kwargs)
def doOperator(self):
return self.num1 + self.num2
# 具体的策略实现类。 做减法运算
class Substract(Operator):
def __init__(self, *args, **kwargs):
super(Substract, self).__init__(*args, **kwargs)
def doOperator(self):
return self.num1 - self.num2
# 具体的策略实现类。 做乘法运算
class Multiply(Operator):
def __init__(self, *args, **kwargs):
super(Multiply, self).__init__(*args, **kwargs)
def doOperator(self):
return self.num1 * self.num2
# 具体的策略实现类。 做除法运算
class Divid(Operator):
def __init__(self, *args, **kwargs):
super(Divid, self).__init__(*args, **kwargs)
def doOperator(self):
try:
return self.num1 / self.num2
except ZeroDivisionError:
print("num2 can not be zero!")
# Context, 使用策略类
class Context:
def __init__(self):
pass
def doOperator(self, operator):
return operator.doOperator()
# Main方法
if __name__ == "__main__":
num1, num2 = 2, 6
add = Add(num1, num2)
substract = Substract(num1, num2)
multiply = Multiply(num1, num2)
divid = Divid(num1, num2)
context = Context()
print("%s + %s = %s" %(num1, num2, context.doOperator(add)))
print("%s - %s = %s" %(num1, num2, context.doOperator(substract)))
print("%s * %s = %s" %(num1, num2, context.doOperator(multiply)))
print("%s / %s = %s" %(num1, num2, context.doOperator(divid)))
=========================================================================================
运行结果如下
2 + 6 = 8
2 - 6 = -4
2 * 6 = 12
2 / 6 = 0.3333333333333333
原文:https://www.cnblogs.com/SadieWangFly/p/14350127.html