设计模式之——浅谈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 ...
随机推荐
- YUV数据YUY2到I420
/* 主要的采样格式有YCbCr 4:2:0.YCbCr 4:2:2.YCbCr 4:1:1和 YCbCr 4:4:4.其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度 ...
- mout系统流程
mount()的最后一个参数data是传给文件系统解释的,有兴趣可以跟踪一下系统调用mount的流程(以vfat为例): sys_mount()-->do_mount()-->do_add ...
- put ListView in a ScrollView(bug fixed)
Android: put ListView in a ScrollView When I need to use ListView with other controls on the same ...
- erlang工具:Sublime Text的插件
SublimErl :https://github.com/ostinelli/SublimErl (推荐,操作较简单) ...
- 基于bootstrap的select(可多选)
如图:
- Java 基本概念:jvm、jdk、jre、jse
jvm 是java虚拟机,将java的class字节码文件翻译成二进制可执行程序.jdk 是java的开发包 Javasdk, java的开发工具,包含SUN公司提供的javaAPI,将java源码编 ...
- openal 基础知识2
三枚举扩展包(enumeration extension,“ALC_ENUMERATION_EXT”) 开发者可以通过这个extension得到一个字符串列表,区分不同的渲染/捕捉设备.OpenALr ...
- 如何在ChemDraw中绘制分子立体结构
ChemDraw是当前最常用的的化学结构绘图软件,软件功能包括化学作图.分子模型生成.化学数据库信息管理等,可以说是化学家和生物学家所需要最终极的化学结构绘图工具.本教程主要介绍ChemDraw绘制分 ...
- swift--设置app图标和启动页面
1,如下图:
- Windows7 64bits下安装TensorFlow CPU版本(图文详解)
不多说,直接上干货! Installing TensorFlow on Windows的官网 https://www.tensorflow.org/install/install_windows 首先 ...