常用设计者模式---策略模式

来源:互联网 发布:java内存溢出 编辑:程序博客网 时间:2024/05/21 21:42

1、目标

了解策略模式要解决的主要问题

举出常见的策略模式使用场景

说出JDK中运用策略模式的实例

2、什么是策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

简单的说,策略模式就是要应对规则变化和新规则加入对程序带来的影响。对于面向对象程序设计如何实现呢?通过接口可以避免直接调用规则,从而使得业务变化不会对规则产生影响。同时,添加新规则也不会影响业务流程。

3、策略模式结构


这个模式涉及到三个角色:

  ●  环境(Context)角色:持有一个Strategy的引用。

  ●  抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  ●  具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

源代码

    环境角色类

public class Context {    //持有一个具体策略的对象    private Strategy strategy;    /**     * 构造函数,传入一个具体策略对象     * @param strategy    具体策略对象     */    public Context(Strategy strategy){        this.strategy = strategy;    }    /**     * 策略方法     */    public void contextInterface(){                strategy.strategyInterface();    }    }
  抽象策略类

public interface Strategy {    /**     * 策略方法     */    public void strategyInterface();}
    具体策略类

public class ConcreteStrategyA implements Strategy {    @Override    public void strategyInterface() {        //相关的业务    }}
public class ConcreteStrategyB implements Strategy {    @Override    public void strategyInterface() {        //相关的业务    }}
public class ConcreteStrategyC implements Strategy {    @Override    public void strategyInterface() {        //相关的业务    }}

4、策略模式的优点和缺点

优点:遵循面向对象设计原则,降低设计耦合、便于扩展。

(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。(3)提供了一种替代继承的方法,而且既保持了继承的优点(代码重用),还比继承更灵活(算法独立,可以任意扩展);

缺点:当实现算法较多时,会增加需要维护的类的数量。可以使用工厂方法来解决。

(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

5、运用场景
(1)需求:商场收银系统,实现对不同情况(正常收费、折扣收费、返利收费等)的收费。
(2)例子1:一个菜单功能能够根据用户的“皮肤”首选项来决定是否采用水平的还是垂直的排列形式。同事可以灵活增加菜单那的显示样式。
(3)例子2:出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机。每个策略都可以得到相同的结果,但是它们使用了不同的资源。选择策略的依据是费用,时间,使用工具还有每种方式的方便程度 。
(4)假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。
代码实现连接:http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
6、回答1问题

1、请说明策略模式符合哪些面向对象设计原则?

  •  策略模式中,通过接口(interface)实现了业务与具体实现的隔离。所以,策略模式符合“面向接口,而不是面向实现”的编程原则。
  • 在实现具体的策略(算法)时,通过实现接口可以方便地增加多个具体实现。所以,策略模式符合“开放封闭原则,对扩展开放,对修改封闭”。
  • 业务代码(Context)只依赖规则接口(Strategy),不依赖具体实现。所以,策略模式符合“依赖倒置原则,高层(业务模块)不依赖底层模块(具体算法),只依赖抽象接口”。
2、请用说明下列Java API设计中是如何使用策略模式的(http://www.importnew.com/12853.html)
  • 排序工具类Collections中sort的基本实现:通过比较器comparator实现不同的对象比较策略。
  • 正则表达式的Pattern实现:通过符合语法规则的正则表达式,以及匹配参数,实现不同的匹配策略。
  • 线程池ThreadPoolExecutor实现:通过提供不同的排队策略和拒绝策略,在线程池ThreadPoolExecutor的管理中,提供不同的管理策略。
  • ForkJoin框架的ForkJoinPool:通过提供并发任务线程池管理,对可分治解决的计算任务,开发者只需通过继承RecursiveAction或RecursiveTask即可实现不同的算法。
  • 图形框架SWT Layout:对于需要实现多种不同布局的图形元素,通过Layout接口即可满足各种需求的布局策略。
7、策略模式和简单工厂模式的区别

相同点

1、   都是用到了封装、继承、多态;

2、   都抽出一个接口或者抽象类,针对不同的情况,有不同的实现类。

不同点

1、   使用方式不同,工厂是静态的,策略的上下文是需要创建对象的;

2、   工厂产生的是对象,不同情况下产生不同的对象;

3、   策略产生的是策略,或者说是算法,不同情况下使用不同的算法。

结论

无论何种设计模式,都是基于面相对象的三大特性,即封装、继承、多态。

用更直白的话来形容:

工厂模式:根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。
即根据你给出一些属性来生产不同行为的一类对象返回给你。
关注对象创建
策略模式:用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。
即根据你给出对应的对象来执行对应的方法。
关注行为的选择


本文参考链接:http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html

                      http://www.importnew.com/12853.html

0 0