策略模式——对象行为型模式

一、意图
定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换。本模式使得算法可独立于使用它的客户而变化。
二、适用性
以下情况可使用Strategy模式

  • 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
  • 需要使用一个算法的不同变体。例如,你可能会定义一些反应不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
  • 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的,与算法相关的数据结构。
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入他们各自的Strategy类中以替代这些条件语句。

三、结果
这里写图片描述

四、代码

public interface CalculateStrategy {

    /**
     * 按距离计算价格
     *
     * @param km 公里
     * @return 返回价格
     */
    int calculatePrice(int km);
}
public class BusStrategy implements CalculateStrategy {
    @Override
    public int calculatePrice(int km) {
        int extraTotal = km - 10;
        int extraFactor = extraTotal / 5;
        int fraction = extraFactor % 5;
        int price = 1 + extraFactor * 1;
        return fraction > 0 ? ++price : price;
    }
}
public class TaxiStrategy implements CalculateStrategy {
    @Override
    public int calculatePrice(int km) {
        return km*2;
    }
}
public class SubwayStrategy implements CalculateStrategy {
    @Override
    public int calculatePrice(int km) {

        if (km <= 6) {
            return 3;
        } else if (km > 6 && km < 12) {
            return 4;
        } else if (km > 12 && km < 22) {
            return 5;
        } else if (km > 22 && km < 32) {
            return 6;
        }
        return 7;
    }
}
public class PriceCalculator {
    CalculateStrategy mStrategy ;


    public void setStrategy(CalculateStrategy mStrategy) {
        this.mStrategy = mStrategy;
    }

    public int calculatePrice(int km){
        return mStrategy.calculatePrice(km);
    }
}
public class Client {
    public static void main(String[] args){
        PriceCalculator priceCalculator = new PriceCalculator();
        priceCalculator.setStrategy(new BusStrategy());
        int busPrice =priceCalculator.calculatePrice(20);
        priceCalculator.setStrategy(new TaxiStrategy());
        int taxiPrice = priceCalculator.calculatePrice(20);
        priceCalculator.setStrategy(new SubwayStrategy());
        int subwayPrice = priceCalculator.calculatePrice(20);

        System.out.printf("bus:%d ,taxi:%d,subway:%d",busPrice,taxiPrice,subwayPrice);


    }
}

输出结果:
bus:4 ,taxi:40,subway:5
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值