码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之Strategy Pattern

时间:2015-05-24 23:38:21      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:设计模式   策略模式   

Declaration

首先声明, 本篇blog的内容是参考Design pattern FAQ Part 3 ( Design pattern training series)这篇博文写的, 图片也是来自这篇博客. 部分是翻译, 加上自己的理解形成这篇博文. 希望和大家一起学习设计模式, 共同进步.

Scene for Strategy Pattern

Strategy Pattern,这个翻译成策略模式应该是没有问题的。策略模式希望做到的是在运行的情况下,根据对象的类型选择使用的算法。简单来说策略就是对应算法封装的类,使用不同的算法则对应使用不同类的对象。

Strategy Pattern

我们举个例子来看看策略模式是如何实践的。假设对于一个数学计算,我们有两个计算策略,一个是加法,一个是减法。下面的图描绘的就是这个例子。计算的结果根据使用的策略决定,如果是加法策略,则给出加法的结果;如果是减法策略,则执行减法操作。因此策略仅仅是将算法封装到类中。
技术分享

In Action

首先我们来看看这些算法如何被封装进类里面,下面的图展示的就是这个代码片段。

‘add’算法封装在clsAddStratergy中,‘substract’封装在clsSubstractStratergy中,他们都是继承与clsStrategy这个父类,这个父类中定义了子类必须实现的Calculate方法。
技术分享

现在我们定义一个类clsMaths里面封装了一个clsStrategy的对象,并且提供一个set函数来设置使用哪种策略。如下图所示。
技术分享

下面的客户端代码片段展示了clsMaths如何被使用,以及如何在运行的是使用setStrategy函数来指定使用的算法策略。
技术分享

Conclusion

策略模式有点体现在,使得Client不用在意算法实现的细节,只需要知道调用相关的类实例,这一点降低了客户端的复杂度。另外,由于策略类遵循相同的接口,因此修改策略的具体实现并不影响客户端的调用,并且Client可以方便的进行策略替换或者自定义策略类。

策略模式的缺点,主要是因为不同的策略类对算法进行了封装,因此在客户端进行调用的时候,需要user能够清楚的了解实现的策略之间的差别,以及应该选用什么策略。其次策略模式增加了一个项目中维护的类的个数。

另外值得一提的是,为了进一步降低client的压力,我们可以将简单工厂模式和策略模式进行组合,这一点读者可以考虑一下。

微信公众号CodingRush

分享编程、算法、机器学习、数据挖掘、推荐系统、大数据计算框架等知识,欢迎扫码关注。
技术分享

设计模式之Strategy Pattern

标签:设计模式   策略模式   

原文地址:http://blog.csdn.net/geniusluzh/article/details/45957589

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!