行为型之策略模式

序言

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

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

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

策略模式

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


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

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

后记

转载于:https://www.cnblogs.com/codebug/p/7396938.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值