行为型之策略模式

序言

  模板方法模式通过把不变的行为搬移到父类(抽象类),去除了子类中的重复代码;对于不同的子类有不同实现的行为,在父类中声明一些抽象方法来迫使子类实现剩余的逻辑,提高程序的扩展性。

  策略模式有如下几种角色:

  • 抽象策略角色:接口或者抽象类
  • 具体策略角色:类,策略的具体实现方法
  • 环境角色:类,持有一个Strategy类的引用

策略模式

 出行时,每个人都会面临买票。购买时,基本上会有3种方式,飞机,火车,巴士。在这里每一种方式,都对应的是一种策略。 
 策略模式的结构如下图:

![](http://images2017.cnblogs.com/blog/946528/201708/946528-20170819161240225-1054917823.png)
``` /** * 抽象策略角色,买票策略 */ public interface TicketStrategy {
public double countTicketPrice(int num);

}

/**

  • 具体策略角色,飞机策略
    */
    public class AirplaneTicketStrategy implements TicketStrategy {
    public double countTicketPrice(int num) {
    return num * 600.0;
    }
    }

/**

  • 具体策略角色,火车策略
    */
    public class TrainTicketStrategy implements TicketStrategy {
    public double countTicketPrice(int num) {
    return 250.0 * num;
    }
    }

/**

  • 具体策略角色,巴士策略
    */
    public class BusTicketStrategy implements TicketStrategy {

    public double countTicketPrice(int num) {
    return 200.0 * num;
    }
    }

/**

  • 环境角色,售票机
    */
    public class TicketMachine {

    private TicketStrategy ticketStrategy;

    public TicketMachine(TicketStrategy ticketStrategy){
    this.ticketStrategy = ticketStrategy;
    }

    public double buy(int num){
    return ticketStrategy.countTicketPrice(num);
    }
    }

/**

  • 测试策略模式
    */
    public class StrategyTest {

    @Test
    public void testStrategy(){

     TicketMachine ticketMachine = new TicketMachine(new AirplaneTicketStrategy());
     System.out.println("花销:" + ticketMachine.buy(5) + "元");
    

    }
    }


>好处:
 1. <span style="color:red">策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或欣慰的环境类就可能会有一些子类,没个子类提供不同的算法或行为。但是,这样一来算法或行为的使用者就和算法本身混在一起,继承使得动态改变算法或行为变得不可能。</span>
 2. <span style="color:red">策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或欣慰的逻辑混合在一起,统统列在1个多种转移语句里面,比使用继承的方法还要原始、落后。</span>

>坏处:
 1. <span style="color:blue">客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。</span>
 2. <span style="color:blue">策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。</span>


### 后记
>- 撰写本文考了不少博文,在此一并谢过。
[《JAVA与模式》之策略模式](http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html)
>- 转载时,请注明出处,这是人格的一种体现。
[https://www.zybuluo.com/BertLee/note/855647](https://www.zybuluo.com/BertLee/note/855647)
>- 能力有限,如有纰漏,请在评论区指出,老朽虽一把年纪,必当感激涕零,泪如雨下。
posted @ 2017-08-19 16:11  吃不了兜着走  阅读(140)  评论(0编辑  收藏  举报