设计模式之——浅谈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 ...
随机推荐
- 多个进程对同一个监听套接字调用函数gen_tcp:accept/1
源于<<erlang程序设计>>的第14章的14.1.4大约第197页. 未发现多个进程对同一个监听套接字调用函数gen_tcp:accept/1比单进程的效率更高或者更快.
- java web接口controller测试控制台输出乱码
接口上配置:
- 手淘H5移动端适配方案flexible源码分析
移动端适配一直是一个值得探讨的问题,在业余时间我找了一些页面,查看了一些厂商对于移动端H5页面的适配方案,看到了几个典型的例子,今天就来记录一下我看到的第一个典型的例子,也是我们公司目前普通H5项目正 ...
- 【转】如何读懂Oracle文档中的语法图
转自:http://blog.itpub.net/22990797/viewspace-750157/ Oracle文档中用到了两种表达语法的方法,语法图和BNF. BNF, Backus-Naur ...
- asp.net mvc forms身份认证
web.config配置 <authentication mode="Forms"> <forms loginUrl="~/Login/Index&qu ...
- Ubuntu 12.04/13.04 安装 Oracle11gR2:该笔记已经陈旧!请参考后续的笔记
注意点: 在 ubuntu的 /bin 下建立以下几个基本命令的链接: basename awk sh->bash | sh -> ksh 安装以下几个必须的包: binutils bui ...
- css属性cusor
<html> <body> <p>请把鼠标移动到单词上,可以看到鼠标指针发生变化:</p> <span style="cursor:au ...
- ssh在本地调用远程主机上的命令,不登录远程主机shell
需求描述: 在实际shell脚本的编写过程中,需要通过ssh远程执行一个命令,并返回执行的结果 简单来说,就是将命令发送到远程的主机上进行执行,但是并没有实际的登录到远程主机上.即通过 ssh的方式本 ...
- gevent动态随时添加任务
关于爬虫,有scrapy框架,也有requests加协程 协程 进程的方法. 相关的包很多,比如threading .threadpool.multiprocessing,还有threadpoolex ...
- ubuntu网络配置命令
Ubuntu网络配置例如: (1) 配置eth0的IP地址, 同时激活该设备. #ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up (2) 配置e ...