策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换。该模式可使得算法能独立于使用它的客户而变化。Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的,跟创建什么样的产品没有关系,此模式解决的问题是把一个系列完成相同工作,却实现不同的算法(行为)包装到一系列的策略类里面,使得它们可以相互替换,提供一个访问接口,由客户端决定在什么情况下使用什么具体策略,来完成某一功能。并可以自由的添加修改相应的算法,轻松实现可插入式(Pluggable)的系统的开发。对于客户端来说,不关心实例化了那些对象,生产了那些产品,只需要提供要使用那种策略去完成某一功能。

例子:商品打折a.商品策略:分图书、衣服...b.打折策略:高级会员打8折,中级打9折,普通不打折

1.新建一个商品接口,封装获取价格的方法;图书、衣服实现该Goods接口
public interface Goods {public double getPrice();
}

public class Goods_Book implements Goods{@Overridepublic double getPrice() {return 40;}}

public class Goods_Clothes implements Goods{@Overridepublic double getPrice() {return 200;}
}

2.新建一个打折策略接口,封装计算某商品价格的方法;各个会员打折策略类实现该接口

public interface StrategyInterface {/*** 计算商品价格* @param goods* @return*/double culPrice(Goods goods);//接口中的方法默认public
}

/*** 高级会员 打折策略* @author Administrator**/
public class StrategyA implements StrategyInterface {@Overridepublic double culPrice(Goods goods) {System.out.println("高级会员,打8折");return goods.getPrice() * 0.8;}}

/*** 中级会员 打折策略* @author Administrator**/
public class StrategyB implements StrategyInterface {@Overridepublic double culPrice(Goods goods) {System.out.println("中级会员,打9折");return goods.getPrice() * 0.9;}
}

/*** 普通会员 打折策略* @author Administrator**/
public class StrategyC implements StrategyInterface {@Overridepublic double culPrice(Goods goods) {System.out.println("普通会员,不打折");return goods.getPrice();}
}

3.新建一个Price类,定义商品策略和打折策略,然后根据这2个策略进行计算价格

public class Price {private Goods goods;//商品种类private StrategyInterface strategy;//打折策略public Price(Goods goods, StrategyInterface strategy) {this.goods = goods;this.strategy = strategy;}/*** 根据商品种类和打折策略计算折后价格* @return*/public double culPrice(){return this.strategy.culPrice(goods);}
}

4.写客户端(Test类)调用策略

/*** 策略模式:*     并不决定在何时使用何种算法。*     在什么情况下使用什么算法是由客户端(即Test类)决定的。* @author Administrator**/
public class Test {public static void main(String[] args) {//定义何种商品和策略
//        Goods goods = new Goods_Book();Goods goods = new Goods_Clothes();StrategyInterface strategy = new StrategyA();
//        StrategyInterface strategy = new StrategyB();
//        StrategyInterface strategy = new StrategyC();
        System.out.println("原价:"+goods.getPrice()+",折后价:"+new Price(goods, strategy).culPrice());}
}

5.查看结果

高级会员,打8折
原价:200.0,折后价:160.0

中级会员,打9折
  原价:200.0,折后价:180.0

...


jdk中的这些实现都用到了策略模式

  • java.util.Comparator#compare()
  • javax.servlet.http.HttpServlet
  • javax.servlet.Filter#doFilter()

总结:引自:http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html

策略模式的重心

  策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。

算法的平等性

  策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。

  所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。

运行时策略的唯一性

  运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。

公有的行为

  经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。

  这其实也是典型的将代码向继承等级结构的上方集中的标准做法。

策略模式的优点

  (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

  (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

策略模式的缺点

  (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

转载于:https://www.cnblogs.com/yangzhenlong/p/5143777.html

Strategy策略模式相关推荐

  1. Java的设计模式----strategy(策略模式)

    设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...

  2. 设计模式——Strategy(策略)模式

    目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 实际应用举例 4.1 Context--List列表和StuContext 4.2 具体策略:ConcreteStrat ...

  3. [设计模式] —— Strategy 策略模式

    文章目录 Strategy 策略模式 动机 定义 示例代码 结构图 总结 Strategy 策略模式 组件协作模式通过晚绑定,来实现框架与应用程序之间的松耦合.是框架和引用程序协作常用的. 动机 某些 ...

  4. 【设计模式】2.Strategy 策略模式

    Strategy 策略模式 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也 ...

  5. 设计模式之Strategy策略模式

    文章目录 前言 一.Strategy策略模式 二.策略模式原则 三.使用场景 1.先做比较练习 2.为一组对象排序 3.使用Lambda表达式的方式 前言 本人对于设计模式的学习,仅供参考! 一.St ...

  6. 设计模式学习笔记--Strategy 策略模式

    所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...

  7. Strategy 策略模式

    意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 动机 策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法, ...

  8. 步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)

    策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern defines a fami ...

  9. 12种行为模式 之2 STRATEGY 策略模式

    [b]策略模式的组成[/b] 1):抽象策略角色: 通常由一个接口或者抽象类实现. 2):具体策略角色:包装了相关的算法和行为. 3):环境角色:持有一个策略类的引用,最终给客户端(上层模块)调用. ...

最新文章

  1. SQL 中left join ,inner join,right join的区别
  2. 【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )
  3. Python XML解析
  4. linux命令收集录
  5. Java方法区和运行时常量池溢出问题分析(转)
  6. img 居中_如何解决img标签下面的小空隙(详细教程)
  7. python个人所得税怎么写_Python实现的个人所得税计算器示例
  8. 易筋SpringBoot 2.1 | 第十六篇:SpringBoot通过JDBC访问数据库
  9. windows下IOS证书制作,IOS证书在线制作
  10. 关于机械臂仿真的几款软件简介
  11. 桌面音乐频谱linux,音乐频谱桌面特效下载-X Music Spectrum(音乐频谱桌面特效)免费版 v1.0.0.8_系统之家...
  12. 什么是 CDN 边缘服务器 - Edge Server
  13. SQL Server常用函数整理
  14. 在nginx中设置三级域名
  15. java io 操作实例
  16. Linux 与 Python编程2021 经典函数实例 educoder实训
  17. Docker国内镜像源设置
  18. Oracle设计简单的图书管理
  19. C++的3d游戏笔录-基于panda3d(1)
  20. 游戏特效贴图的制作与应用

热门文章

  1. OCCI入门(VC2010下配置)
  2. CommandBehavior.CloseConnection有何作用
  3. oracle恢复误删除记录
  4. 前端入门:快速开发基于 HTML5 网络拓扑图应用
  5. mysql 开启远程访问
  6. JVM内存管理及GC机制
  7. [异常解决] How make ubuntu use Google Search
  8. BeautifulSoup学习笔记
  9. 谈谈设计不足(under-engineering)与过度设计(over-engineering)
  10. VISTA IIS Worker Process 已停止工作 解决办法