美文网首页设计模式
android源码中使用的设计模式(行为型--策略模式)

android源码中使用的设计模式(行为型--策略模式)

作者: 田间小鹿 | 来源:发表于2017-12-05 11:42 被阅读0次

    行为型模式:类和对象交互及分配职责

    1.1定义

    策略模式定义了一系列的算法,并将每个算法封装起来,而且使它们可以互相换

    策略模式

    1.2使用场景

    1. 针对同一类型问题的多种处理方式,仅仅是具体行为有差别
    2. 需要安全地封装多种同一类型的操作时
    3. 出现同一抽象类有多个子类,而且又需要使用if-else或者swithc-case来具体实现行为对象。

    1.3实现方法

    1. 定义策略抽象类或者接口
    /**
     * 计算接口
     */
    public interface CalculateStrategy {
        /**
         * 按距离来计算价格
         * 
         * @param miles 公里
         * @return 返回价格
         */
        int calculatePrice(int miles);
    }
    
    1. 实现具体接口
    1.公交车
    // 公交车价格计算策略
    public class BusStrategy implements CalculateStrategy {
        /**
         * 北京公交车,10里之内1块钱,超过十公里之后每加一块钱可以乘5公里
         * 
         * @param miles 公里
         * @return
         */
        @Override
        public int calculatePrice(int miles) {
            // 超过10公里的总距离
            int extraTotal = miles - 10;
            // 超过的距离是5公里的倍数
            int extraFactor = extraTotal / 5;
            // 超过的距离对5公里的取余
            int fraction = extraTotal % 5;
            // 价格计算
            int price = 1 + extraFactor * 1;
            return fraction > 0 ? ++price : price;
        }
    }
    2.地铁计算
    // 地铁价格计算策略
    public class SubwayStrategy implements CalculateStrategy {
     
        /**
         * 6公里(含)内3元;6-12公里(含)4元;12-22公里(含)5元;22-32公里(含)6元;
         * 
         * @param miles 公里
         * @return
         */
        @Override
        public int calculatePrice(int miles) {
            if (miles <= 6) {
                return 3;
            } else if (miles > 6 && miles < 12) {
                return 4;
            } else if (miles > 12 && miles < 22) {
                return 5;
            }
            else if (miles > 22 && miles < 32) {
                return 6;
            }
            // 其他距离我们简化为7块
            return 7;
        }
    }
    3.出租车
    // 出租车计算策略
    public class TaxiStrategy implements CalculateStrategy {
     
        // 价格我们简单计算为 公里数 * 2
        @Override
        public int calculatePrice(int km) {
            return km * 2;
        }
     
    }
    
    

    3.策略控制类

    // 公交出行价格计算器
    public class TranficCalculator {
        CalculateStrategy mStrategy;
        public void setStrategy(CalculateStrategy mStrategy) {
            this.mStrategy = mStrategy;
        }
        public int calculatePrice(int km) {
            return mStrategy.calculatePrice(km);
        }
    }
    
    

    4.调用方法

     public static void main(String[] args) {
            TranficCalculator calculator = new TranficCalculator();
            calculator.setStrategy(new BusStrategy());
            System.out.println("公交车乘16公里的价格 : " + calculator.calculatePrice(16));
            calculator.setStrategy(new TaxiStrategy());
            System.out.println("出租车乘16公里的价格 : " + calculator.calculatePrice(16));
        }
    
    

    1.4android中使用

    插值器(TimeInterpolator)

    动画执行流程

    动画加载流程

    • 1.对view设置动画效果。其中包含设置了动画的开始时间,设置动画,设置刷新父控件缓存,刷新view和子视图。
    • 2.ViewRootImpl实现了ViewPrent。刷新子view的指定区域。
    • 3.sechduleTraverals()中有一个对象为TraversalsRunnable() 线程
    • 4.线程会掉 doTraversal()进行对view的重绘。其中包括了计算,布局,重绘。
      1. 重绘会调用子类的实现方法。
    • 6.dispatchDraw空函数,在他的实现类中实现。ViewGroup中实现。
    • 7.然后调用子类的draw具体实现。
    • 8.在draw添加animation动画效果。
    • 9.在动画中通过getTransformation对动画效果就行设置。

    A.mInterpolator.getInterpolation(normalizedTime)
    设置插值器

     AccelerateDecelerateInterpolator      //在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
     AccelerateInterpolator                //在动画开始的地方速率改变比较慢,然后开始加速
     AnticipateInterpolator                //开始的时候向后然后向前甩
     AnticipateOvershootInterpolator       //开始的时候向后然后向前甩一定值后返回最后的值
     BounceInterpolator                    //动画结束的时候弹起
     CycleInterpolator                     //动画循环播放特定的次数,速率改变沿着正弦曲线
     DecelerateInterpolator                //在动画开始的地方快然后慢
     LinearInterpolator                    //以常量速率改变
     OvershootInterpolator                 //向前甩一定值后再回到原来位置
    

    在这些插值器中实现了

    B.applyTransformation() 必须在动画效果中被重新重写

    对应的UML图

    插值器

    相关文章

      网友评论

        本文标题:android源码中使用的设计模式(行为型--策略模式)

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