假设我们要出去旅游,而去旅游出行的方式有很多,有步行,有坐火车,有坐飞机等等。而如果不使用任何模式,我们的代码可能就是这样子的。
/**
 * 这样做有一个致命的缺点,一旦出行的方式要增加,
 * 我们就不得不增加新的else if语句,而这违反了面向对象的原则之一,
 * 对修改封闭。而这时候,策略模式则可以完美的解决这一切。
 */
public static void testNormol() {TravelStrategy walk=new TravelStrategy(TravelStrategy.Strategy.WALK);
    walk.travel();

    TravelStrategy plane=new TravelStrategy(TravelStrategy.Strategy.PLANE);
    plane.travel();

    TravelStrategy subway=new TravelStrategy(TravelStrategy.Strategy.SUBWAY);
    subway.travel();
}
public class TravelStrategy {enum Strategy{WALK,PLANE,SUBWAY
    }private Strategy strategy;
    public TravelStrategy(Strategy strategy){this.strategy=strategy;
    }public void travel(){if(strategy==Strategy.WALK){print("walk");
        }else if(strategy==Strategy.PLANE){print("plane");
        }else if(strategy==Strategy.SUBWAY){print("subway");
        }}public void print(String str){System.out.println("出行旅游的方式为:"+str);
    }}
这样做有一个致命的缺点,一旦出行的方式要增加,我们就不得不增加新的else if语句,而这违反了面向对象的原则之一,对修改封闭。而这时候,策略模式则可以完美的解决这一切。
采用策略模式如下:
/**
 * 可以看到,应用了策略模式后,如果我们想增加新的出行方式,
 * 完全不必要修改现有的类,我们只需要实现策略接口即可,
 * 这就是面向对象中的对扩展开放准则。
 * 假设现在我们增加了一种自行车出行的方式。只需新增一个类即可。
 */
public static void testStrategy(){TravelContext travelContext=new TravelContext();
    travelContext.setStrategy(new PlaneStrategy());
    travelContext.travel();
    travelContext.setStrategy(new WalkStrategy());
    travelContext.travel();
    travelContext.setStrategy(new SubwayStrategy());
    travelContext.travel();
}
/**
 * Created by Administrator on 2017/9/15.
 */

public interface Strategy {void travel();

}
/**
 * Created by Administrator on 2017/9/15.
 */

public class PlaneStrategy implements Strategy {@Override
    public void travel() {Log.d("PlaneStrategy","travel");
    }
}
/**
 * Created by Administrator on 2017/9/15.
 */

public class SubwayStrategy implements Strategy {@Override
    public void travel() {Log.d("SubwayStrategy","travel");
    }
}
/**
 * Created by Administrator on 2017/9/15.
 */

public class WalkStrategy implements Strategy{@Override
    public void travel() {Log.d("WalkStrategy","travel");
    }
}
public class TravelContext {Strategy strategy;

    public Strategy getStrategy() {return strategy;
    }public void setStrategy(Strategy strategy) {this.strategy = strategy;
    }public void travel() {if (strategy != null) {strategy.travel();
        }}}

可以看到,应用了策略模式后,如果我们想增加新的出行方式,完全不必要修改现有的类,我们只需要实现策略接口即可,这就是面向对象中的对扩展开放准则。假设现在我们增加了一种自行车出行的方式。只需新增一个类即可。

总结:
策略模式:
1.它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。
 2.多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。 
 3.对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
步骤:
1.定义了一个接口
2.一些具体的实现类,实现借口
3.一个中转类,处理策略,选择哪种策略

下面,我们分析Android中的动画是如何使用策略模式的。

而在Android的系统源码中,策略模式也是应用的相当广泛的.最典型的就是属性动画中的应用.
在属性动画中,有一个东西叫做插值器,它的作用就是根据时间流逝的百分比来来计算出当前属性值改变的百分比.
平时我们使用的时候,通过设置不同的插值器,实现不同的动画速率变换效果,
比如线性变换,回弹,自由落体等等。这些都是插值器接口的具体实现,也就是具体的插值器策略。我们略微来看几个策略。
private Interpolator line = new LinearInterpolator();// 线性
private Interpolator acc = new AccelerateInterpolator();// 加速
private Interpolator dce = new DecelerateInterpolator();// 减速
private Interpolator accdec = new AccelerateDecelerateInterpolator();// 先加速后减速

public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {public LinearInterpolator() {}public LinearInterpolator(Context context, AttributeSet attrs) {}public float getInterpolation(float input) {return input;
    }/** @hide */
    @Override
    public long createNativeInterpolator() {return NativeInterpolatorFactoryHelper.createLinearInterpolator();
    }
}

Android 最常用的设计模式十 安卓源码分析——策略模式(Strategy)相关推荐

  1. Android 9(P)之init进程启动源码分析指南之一

         Android 9 之init进程启动源码分析指南之一 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...

  2. Android 9 (P)之init进程启动源码分析指南之三

          Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...

  3. Android 8.1/9.0 MTK Camera源码分析之录像快门声音控制流程

    前面已经针对拍照快门声音控制流程进行了分析,接下来分析一下录像快门声音的控制流程. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程 这两篇文章其实都是相对于手机系统RO ...

  4. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程

    Android 8.1/9.0 MTK Camera源码分析之快门声音控制 在Android 8.1上mtk camera有控制快门声音的接口,但是并没有了控制录像快门声音的接口.之所以会有这个现象, ...

  5. 解密android日志xlog,XLog 详解及源码分析

    一.前言 这里的 XLog 不是微信 Mars 里面的 xLog,而是elvishew的xLog.感兴趣的同学可以看看作者 elvishwe 的官文史上最强的 Android 日志库 XLog.这里先 ...

  6. 【C++】Android (Light)RefBase-sp-wp引用计数-智能指针源码分析

    文章目录 1.RefBase简介 2.RefBase源码分析 3.RefBase使用注意事项 4.总结 1.RefBase简介 什么是RefBase?RefBase是Android中的一个C++类,用 ...

  7. 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )

    文章目录 一.Protobuf 源码分析 二.创建 Protobuf 对象 三.完整代码示例 四.参考资料 一.Protobuf 源码分析 Protobuf 源文件如下 : addressbook.p ...

  8. Android SQLite多线程读写和线程同步源码分析

    没啥诀窍,只需保证几个线程都是用的一个SQLiteDataBase对象就行了. 如果我们非要在不同线程中用两个或更多的SQLiteDataBase对象呢,当然这些SQLiteDataBase对象所操作 ...

  9. 【Android CameraX】CameraXBasic —— 官方CameraX实例源码分析

    一.简介 二.源码分析 2.1 build.gradle 2.2 代码结构 2.3 变量 2.3.1 lensFacing 2.3.2 preview 2.3.3 Image capture 2.3. ...

  10. Android基础-Facebook Rebound 弹性动画库 源码分析

    Facebook Rebound 弹性动画库 源码分析 设计的时候老是闲动画太生硬,于是找到了这个弹性动画.这个弹性动画是facebook开源的,Rebound项目地址:https://github. ...

最新文章

  1. 微软开放 .NET 框架源代码
  2. 教你简单解决过拟合问题(附公式)
  3. JOGL   java调用openGL
  4. WCF+Silverlight部署本机备忘
  5. 重庆python就业工资待遇-重庆python培训多少钱?
  6. 沙家浜《智斗》系列,孩儿版。三、棋手
  7. 「读懂源码系列2」我从 lodash 源码中学到的几个知识点
  8. 计算机二级ppt为客户制作演示文稿,计算机二级ppt真题:制作介绍北京ppt
  9. 《程序是怎样跑起来的》读书笔记——第三章 计算机进行小数运算时出错的原因...
  10. android自定义渐变色圆环,CircleShape渐变颜色圆环
  11. token 的设计方案,这个厉害!
  12. Python 判断字符属于数字、字母、空格
  13. BATJTMD,大厂招聘,都怎么面Java程序员?
  14. 广播风暴和环路是什么
  15. 揭开JS无埋点技术的神秘面纱
  16. 关于彭先生和我的未来呀~
  17. 令人匪夷所思的 Magic 之魔数,你真的不会
  18. 碎片化学习三款必备APP
  19. ​想知道与你最般配的伴侣长什么样?这个“夫妻相”生成器要火
  20. 关于IE浏览器打开部分页面的开发人员工具时闪退打不开的问题

热门文章

  1. matlab求取状态方程的传递函数并实现系统解耦
  2. 计算机的清楚键盘是,电脑键盘上按哪个键是删除键?
  3. 利用网线实现电脑间超大文件传输
  4. 腾讯云IM购买和接入指南
  5. 运算放大器-偏置电流是怎样影响运放电路的
  6. 1.checkpoint防火墙安装以及高可靠性配置
  7. CatBoost快速入门
  8. 计算机光盘无法格式化,c盘无法格式化怎么办 c盘无法格式化的解决方法
  9. python中的def是什么意思啊_等号上面有个def是什么意思?
  10. 在线图片尺寸怎么修改?图片在线修改尺寸大小方法