设计模式之——浅谈strategy模式(策略模式)
strategy模式,即策略模式。个人觉得吧,策略模式更多的是一种思维方式。
首先我们要知道,为什么需要策略模式。举个例子,比如用程序输出今天下午去玩什么。
- PlayGame 玩游戏
package site.wangxin520.gof.strategy.demo; /**
* 玩游戏的类
* @author wangXgnaw
*
*/
public class PlayGame { /**
* 玩游戏的方法
*/
public void playGame(){
System.out.println("玩游戏");
} }
- PlayBall 打球
package site.wangxin520.gof.strategy.demo; /**
* 玩球的类
* @author wangXgnaw
*
*/
public class PlayBall { /**
* 打球的方法
*/
public void playBall(){
System.out.println("打球");
} }
- Test测试类
package site.wangxin520.gof.strategy.demo; /**
* 测试
* @author wangXgnaw
*
*/
public class Test {
public static void main(String[] args) { System.out.println("今天下午做什么事情呢?"); PlayBall p1=new PlayBall();
p1.playBall(); // PlayGame p2=new PlayGame();
// p2.playGame(); }
}
这里就需要注意一点了,因为我们下午只能做一件事情,所以我们只能去注释掉其中一个事情,结果就是:(这里先把打游戏给注释掉了,下一个案例就是把打球给注释掉,因为相同所以略)

由此可见,如果我们想改变自己的下午的安排的话,需要很麻烦的,先去new 一个对应类的实现,然后再调用相应的方法。
既然原来方法很麻烦,那么我们就想办法改变它,当改变选择/安排时候,简化我们的操作。这就需要我们使用策略的设计模式。
策略模式里面就要求我们去在对应安排的类里面提取出一个策略类出来。就比如上面的案例,提取出一个play的策略类,在这个策略类里面判断是哪种安排:
- play类
package site.wangxin520.gof.strategy.demo; /**
* 策略类
* @author wangXgnaw
*
*/
public class Play { //定义了常量,方便调用选择策略
public final static String PLAY_GAME="playGame";
public final static String PLAY_BALL="playBall"; //保存策略的安排
private String playName;
//使用单例模式,避免资源浪费。这两个属性是用于后面对应策略的调用的
private static PlayBall playBall=new PlayBall();
private static PlayGame playGame=new PlayGame(); /**
* 构造函数,传入需要的安排
* @param planName
*/
public Play(String planName) {
this.playName=planName;
} /**
* 这个是玩的类,在这个类中判断,传入的策略是哪一种,并进行对应的操作
*/
public final void play(){
if(PLAY_GAME==playName){
playGame.playGame();
}else if(PLAY_BALL==playName){
playBall.playBall();
}else{
System.out.println("策略安排错误");
}
} }
- 这时候测试语句则为:
package site.wangxin520.gof.strategy.demo; /**
* 测试
* @author wangXgnaw
*
*/
public class Test {
public static void main(String[] args) { System.out.println("今天下午做什么事情呢?"); Play p=new Play(Play.PLAY_GAME);
p.play(); }
}
- 结果为:(当改变方案时候,只需要将参数改变即可,没必要去重新new实现类了,测试打球略)

由此可见,测试方面的代码量大大减少了,也不需要我们再去new新的类了。这种思维模式就是策略模式。
也许你会问,白白多写了play一个类,却只减少了play中的两行代码,这压根也没有简化操作。对此,我就要告诉你了,如果play相关的类都是其他人给你编写好的,而你只需要在test里面简单调用一下,改变参数即可,也不需要你去new出类了,这样对你来说是不是简化了你很多操作。并且,如果使用了spring框架,完全可以把参数放到配置文件中,这样一来,你都不需要去修改代码了,不就是更简化了你的操作了?
策略模式也有第二种方法,提取一个父类的抽象类或者接口,然后面向接口/抽象父类(使用多态)进行编程,这样就更能大大简化开发,并且方便后期维护。
在实际操作中,在切换redis客户端集群版和单机版时候,就采用了这种方法,因为集群版和单机版对redis的NOSQL数据库操作的api是不同的,所以提取出了一个接口,在我们程序中只要面对这个接口进行编程,不管是否是集群版或者单机版。当切换的时候,只需要在配置文件中切换一下相应的配置,而不需要去重新修改已经编号的代码。可见,操作大大简化了。
最后呢,策略模式是一种很好的思维模式,有多种实现方法,熟练运用,能大大提高编码开发效率。与君共勉,好好努力!
设计模式之——浅谈strategy模式(策略模式)的更多相关文章
- Java 设计模式系列(十二)策略模式(Strategy)
Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...
- 3.js模式-策略模式
1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...
- 命令模式 & 策略模式 & 模板方法
一.策略模式 策略模式:封装易变化的算法,可互相替换. GoF<设计模式>中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换.该模式使得算法可独立于它们的客户变化. 比如 ...
- 工厂模式&策略模式。
抽象.封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理.(百度百科) 不断抽象封装 ...
- 简单工厂模式&策略模式-简介与区别
不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...
- 设计模式学习总结(八)策略模式(Strategy)
策略模式,主要是针对不同的情况采用不同的处理方式.如商场的打折季,不同种类的商品的打折幅度不一,所以针对不同的商品我们就要采用不同的计算方式即策略来进行处理. 一.示例展示: 以下例子主要通过对手机和 ...
- 设计模式------STRATEGY(策略模式)
http://blog.csdn.net/wuzhekai1985/article/details/6665197.仅供参考. 策略模式:实现替换功能,如cache替换算法:当发生Cache缺失时,C ...
- 学C#之设计模式系列笔记(1)策略模式
一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...
随机推荐
- 转载:【原译】Erlang常见注意事项(Efficiency Guide)
转自:http://www.cnblogs.com/futuredo/archive/2012/10/17/2726416.html Common Caveats(常见注意事项) Erlang/OTP ...
- Adobe Acrobat 不能打开在线pdf。Adobe Acrobat 应用程序正在被终止,因为内存错误
Adobe Acrobat 应用程序正在被终止,因为内存错误. Adobe Acrobat 不能打开在线pdf. 当出现上面两种错误时. 原因可能是Acrobat的更新有问题. 解决方法:打开C:\D ...
- mysql数据库中,查看数据库的字符集(所有库的字符集或者某个特定库的字符集)
需求描述: mysql中,想要查看某个数据库的字符集.通过information_schma模式下的schemata表来查询 环境描述: mysql版本:5.7.21-log 操作过程: 1.查看in ...
- STL 源代码剖析 算法 stl_algo.h -- search_n
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search_n ------------------------------------- ...
- hdu 4849 最短路 西安邀请赛 Wow! Such City!
http://acm.hdu.edu.cn/showproblem.php?pid=4849 会有非常多奇怪的Wa的题.当初在西安就不知道为什么wa,昨晚做了,由于一些Sb错误也wa了非常久.这会儿怎 ...
- 给IT同学推荐这15个不错的学习网站,收藏起来慢慢看吧
1.学堂在线:http://www.xuetangx.com 目前,学堂在线运行了包括包括清华大学.北京大学.复旦大学.斯坦福大学.麻省理工学院.加州大学伯克利分校等国内外几十所顶尖高校的优质课程.在 ...
- 管理开机启动:chkconfig
CentOS 6 如何设置服务开机启动: [root@localhost ~]$ ls /etc/init.d/httpd # /etc/init.d/目录下必须有启动脚本 [root@localho ...
- console.log篇
前言: 从接触变成开始,就用到了神奇的“console.log”,原来其中还有很多不为自己知道的“小秘密”,今天就深入研究一下吧 1.可以F12打开控制台,输入console.log(xxx),就可以 ...
- centos solr4.5 tomcat 简单安装[已测试ok]
一.环境准备: 1.jdk安装 2.tomcat安装 这两个基本环境的安装在这里就不说了 二.下载solr-4.5.0.tgz 三.安装solr 1.解压solr tar -zxvf /opt/sol ...
- C# EMS Client
从 C# 客户端连接 Tibco EMS 下面例子简要介绍 C# 客户端怎样使用 TIBCO.EMS.dll 来连接 EMS 服务器. using System; using System.Diagn ...