美文网首页
策略模式

策略模式

作者: jacky123 | 来源:发表于2016-06-18 16:03 被阅读30次

    策略模式

    前言

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

    模式结构

    策略模式包含如下角色:

    • 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中的应用

    最明显的就是属性动画:

    • 时间插值器

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/cravdttx.html