python策略模式减少ifelse_如何减少代码中的ifelse或者到代
替的⽅式?
这个时候设计模式中的策略模式可以⼊场了。我试下是否能尽量不写代码给⼤家说明⽩策略模式是怎么回事,以及在这⾥怎么运⽤吧(当然,最后还是会给个⽰例,但描述中尽量不⽤⼤篇幅代码,以求⼤家尽量能听得懂)。
先举个简单的例⼦吧,如果你现在要做⼀个计算器,只考虑简单的加减乘除,你在输⼊时是不是要判断是做加法还是减法之类的?这是通常if else就会进场if (加法)
将两个数相加并返回结果;
else if (减法)
将两个数相减并返回结果;
else if (乘法)
将两个数相乘并返回结果;
else if (除法)python单例模式
将两个数相乘并返回结果;
那今后如果还有很多其他算法加进来,是不是这个else if就会不断的增长。也就是说如果我们把if else看成⼀个独⽴的模块,每⼀次有新功能进来,我们都要修改这个模块的结构,这是不是很明显的就违背了设计模式原则中的OCP原则,即对修改封闭对扩展开放的原则,⽽这,也就往往是bug引⼊的原因了,因为这⾥if else结构⼀改动,先别说你⾃⼰的新功能是否有bug,你改动了if else原有结构,很有可能就让之前其他的else if⾥⾯的代码出问题。
那么我们怎么摒弃if else的结构呢?这时我们就会想,如果我们能实现⼀个计算模块,对外暴露⼀个算法接⼝,提供⼀个标志来指⽰应该执⾏什么算法,这不就完了吗。⽐如执⾏加法时,我们就写:计算模块.执⾏(10,2,'加法'),然后⾃动返回加法后的结果。
⽐如执⾏减法时,我们就写:计算模块.执⾏(10,2,‘减法’),然后⾃动返回减法后的结果。
其他算法类似。这样我们就不需要⽤if else结构了,且接⼝统⼀,整个模块对外的修改是封闭的,即新加⼀个算法后,只需要在模块⾥⾯做扩展,⽽外部调⽤时不需要做⼤改动,只需要提供你需要做的算法的上下⽂,⽐如,做指数运算,只需要写成: 计算模块.执⾏(10,2,‘指数'),然后返回10的2次⽅的结果。
⽽这⾥策略模式的外型已经出现了,只是这⾥的上下⽂我们⼀般不是⽤字符串“加法”等表⽰,⽽是通过⼀个上下⽂context来表⽰。所以策略模式⼀般的表⽰形式是这样的:执⾏加法时,先将计算模块上下⽂切换成加法模式,⽐如我们这⾥计算模块上下⽂叫做Context,那么我们执⾏ context = new Context(加法函数指针), 切换到加法的上下⽂,然后执⾏context.执⾏(10,2),⾃动就返回加法的结果。
⽽执⾏减法时,我们就通过context = new Context(减法函数指针),切换到减法的上下⽂,然后执⾏context.执⾏(10,2),⾃动返回减法的结果。
以上其实就是⼀个策略模式了,⾥⾯的⼀个函数指针就是⼀个策略,结合起上下⽂的切换就形成了策略模式。这⾥上⾯说了该模式为什么对修改是关闭的,但是为什么对扩展是开放的呢?
很简单,你如果现在要⽀持上指数运算,只需要实现⼀个指数函数,然后把指数函数指针传到Context的构造函数: new Context(指数算法函数指针),然后执⾏context.执⾏(10,2)就完了。也就是说你今后⽆论扩展什么算法,你都不需要动到计算模块内部已有的任何结构,只需要写⼀个新的函数即可。这就避免了给原有的代码引⼊任何不确定的bug,这,就是对扩展开放!
⽽在真实情况下,我们往往不是⽤函数指针来实现各种算法,⽽是通过多态和继承,但是理念是⼀样的,当你有了以上的基础之后,去理解完整的策略模式就没有任何问题了。下⾯我给出个⽰例,相信
⼤家有了以上基础后⼀看就会懂了。
注意以上只是⽰例代码,你可别放⼀起执⾏跟我说跑不通什么的。⾥⾯的Add和Substract就是我们上⾯说的通过接⼝、多态、继承实现的策略,⼀下⼦转不过来的话,你把它先替换成我刚才说的函数指针,慢慢再琢磨下,相信很快就可以理解过来了。
好了,以上就是通过策略模式及OCP原则来替代if else的⽅法,扩展性强之余还⾼出很多逼格,是不是很⽞乎呢?[偷笑]最后多谢⼤家时间观看,喜欢的点个赞关注⿎励下,我会⽤⼼给⼤家在知乎上提供更多好的回答和⽂章,谢谢⼤家。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论