策略模式

策略模式

前言

策略模式属于行为类型模式
完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。

模式结构

策略模式包含如下角色:

  • Context: 环境类
  • Strategy: 抽象策略类
  • ConcreteStrategy: 具体策略类


示例

公交车和地铁的价格不一样,我们以乘坐不同交通工具为例,计算交通成本。

定义抽象策略类CalculateStrategy

package com.jack.traffic;

public interface CalculateStrategy {
    int calculatePrice(int km);
}

策略的具体实现

public class BusStrategy implements CalculateStrategy {

    /**
     * 10km以内一元钱,超过10km每加1元可以坐5km
     */
    public int calculatePrice(int km) {
        int extraTotal = km - 10;
        int extraFactor = extraTotal / 5;
        int fraction = extraTotal % 5;
        
        int price = 1 + extraFactor * 1;

        return fraction > 0 ? ++price : price;
    }

}

public class SubWayStrategy implements CalculateStrategy {

    /**
     * <6km,RMB 3 6-12,RMB 4 12-22,RMB 5 22-32,RMB 6 其他 7
     */
    public int calculatePrice(int km) {
        if (km < 6) {
            return 3;
        } else if (km <= 12) {
            return 4;
        } else if (km <= 22) {
            return 5;
        } else if (km <= 32) {
            return 5;
        }

        return 7;
    }

}

环境上下文类

public class TrafficCalculator {
    private CalculateStrategy strategy;

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

    public int calculatePrice(int km) {
        if (strategy == null) {
            throw new IllegalArgumentException("The strategy is null.");
        }

        return strategy.calculatePrice(km);

    }

    public static void main(String[] args) {
        TrafficCalculator trafficCalculator = new TrafficCalculator();
        trafficCalculator.setStrategy(new BusStrategy());

        int km = 13;

        String info = "bus traffic " + km + " km consume RMB:" + trafficCalculator.calculatePrice(km);

        System.out.println(info);
    }
}

结果

Paste_Image.png

策略模式在Android中的应用

最明显的就是属性动画:

  • 时间插值器
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容