首先声明, 本篇blog的内容是参考Design pattern FAQ Part 3 ( Design pattern training series)这篇博文写的, 图片也是来自这篇博客. 部分是翻译, 加上自己的理解形成这篇博文. 希望和大家一起学习设计模式, 共同进步.
Strategy Pattern,这个翻译成策略模式应该是没有问题的。策略模式希望做到的是在运行的情况下,根据对象的类型选择使用的算法。简单来说策略就是对应算法封装的类,使用不同的算法则对应使用不同类的对象。
我们举个例子来看看策略模式是如何实践的。假设对于一个数学计算,我们有两个计算策略,一个是加法,一个是减法。下面的图描绘的就是这个例子。计算的结果根据使用的策略决定,如果是加法策略,则给出加法的结果;如果是减法策略,则执行减法操作。因此策略仅仅是将算法封装到类中。
首先我们来看看这些算法如何被封装进类里面,下面的图展示的就是这个代码片段。
‘add’算法封装在clsAddStratergy中,‘substract’封装在clsSubstractStratergy中,他们都是继承与clsStrategy这个父类,这个父类中定义了子类必须实现的Calculate方法。
现在我们定义一个类clsMaths里面封装了一个clsStrategy的对象,并且提供一个set函数来设置使用哪种策略。如下图所示。
下面的客户端代码片段展示了clsMaths如何被使用,以及如何在运行的是使用setStrategy函数来指定使用的算法策略。
策略模式有点体现在,使得Client不用在意算法实现的细节,只需要知道调用相关的类实例,这一点降低了客户端的复杂度。另外,由于策略类遵循相同的接口,因此修改策略的具体实现并不影响客户端的调用,并且Client可以方便的进行策略替换或者自定义策略类。
策略模式的缺点,主要是因为不同的策略类对算法进行了封装,因此在客户端进行调用的时候,需要user能够清楚的了解实现的策略之间的差别,以及应该选用什么策略。其次策略模式增加了一个项目中维护的类的个数。
另外值得一提的是,为了进一步降低client的压力,我们可以将简单工厂模式和策略模式进行组合,这一点读者可以考虑一下。
分享编程、算法、机器学习、数据挖掘、推荐系统、大数据计算框架等知识,欢迎扫码关注。
原文地址:http://blog.csdn.net/geniusluzh/article/details/45957589