首页 > 其他 > 详细

设计模式-策略模式(Strategy Pattern)

时间:2021-01-30 21:12:04      阅读:27      评论:0      收藏:0      [点我收藏+]

最近工作中需要写一个功能跟据不同的条件对数据进行筛选。如果用传统的方式需要写很多的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

设计模式-策略模式(Strategy Pattern)

原文:https://www.cnblogs.com/SadieWangFly/p/14350127.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!