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模式(策略模式)的更多相关文章

  1. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  2. 3.js模式-策略模式

    1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...

  3. 命令模式 & 策略模式 & 模板方法

    一.策略模式 策略模式:封装易变化的算法,可互相替换. GoF<设计模式>中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换.该模式使得算法可独立于它们的客户变化. 比如 ...

  4. 工厂模式&策略模式。

    抽象.封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理.(百度百科) 不断抽象封装 ...

  5. 简单工厂模式&策略模式-简介与区别

    不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...

  6. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  7. 设计模式学习总结(八)策略模式(Strategy)

    策略模式,主要是针对不同的情况采用不同的处理方式.如商场的打折季,不同种类的商品的打折幅度不一,所以针对不同的商品我们就要采用不同的计算方式即策略来进行处理. 一.示例展示: 以下例子主要通过对手机和 ...

  8. 设计模式------STRATEGY(策略模式)

    http://blog.csdn.net/wuzhekai1985/article/details/6665197.仅供参考. 策略模式:实现替换功能,如cache替换算法:当发生Cache缺失时,C ...

  9. 学C#之设计模式系列笔记(1)策略模式

    一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...

随机推荐

  1. linux -- 服务开机自启动

    好吧,最近需要用到开机启动服务,百度了一下,几乎都是一个版本,然后之间各种传递.我也抄个 ******************************************************* ...

  2. 【转】StackOverflow程序员推荐:每个程序员都应读的30本书

    “如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西.” 很多程序员响应,他们在推荐时也写下自己的评语. ...

  3. Uniprot 数据库-最常用的蛋白质数据库

    Uniprot 数据库是收录信息最全面的蛋白质数据库,包含swissport, uniparc, TrEMBL 3个子数据库: 其中swiss-prot 是手工核对过的 ,非冗余, 有详细注释信息的蛋 ...

  4. 关于Unity 获得和使用GetComponent<MeshFilter>().mesh时的心得

    原文地址:http://blog.sina.com.cn/s/blog_7d9405e50100s061.html 今天在使用Unity3D的时候遇到了一个问题:_tesGameObject是在Pro ...

  5. org.xml.sax.SAXParseException: prolog 中不允许有内容

    org.xml.sax.SAXParseException: prolog 中不允许有内容 digester.fatalError 不下心踢了电源导致的错误应该是解析xml出问题,找了半天不知道哪个x ...

  6. andriod sdk 安卓模拟器修改imei码,位置信息

      imei码就是手机卡的信息一段15位数字,就好像pc的mac地址.很多app注册会检测你是否是手机登录的,就会读取你的imei码,如果读取不到,就说明你可能是用平板等移动设备上网的. app也可以 ...

  7. v$Session详解

    从Oracle10gR1开始,Oracle在V$SESSION中增加关于等待事件的字段,实际上也就是把原来V$SESSION_WAIT视图中的所有字段全部整合到了V$SESSION视图中,开始的时候我 ...

  8. ASP------<iframe>标签如何去掉滚动条

    代码: <iframe src="../Home/Thanks" width="100%" height="500" scrollin ...

  9. Effective C++ Item 18 Make interfaces easy to use correctly and hard to use incorrectly

    1. A good API will provide easy to use interfaces but also provide hard to miss-use interfaces. Usua ...

  10. python2.0_day22_web聊天室二

    上节内容已经实现了客户端使用长轮询的方式获取消息的功能.但是还没有展现到前端.本节内容将实现1.展现消息到前端窗口.2.客户端之间发送图片和文件.3.文件上传时显示进度条 下面我们来实现上面3个功能. ...