Android 最常用的设计模式十 安卓源码分析——策略模式(Strategy)
/** * 这样做有一个致命的缺点,一旦出行的方式要增加, * 我们就不得不增加新的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); }}
/** * 可以看到,应用了策略模式后,如果我们想增加新的出行方式, * 完全不必要修改现有的类,我们只需要实现策略接口即可, * 这就是面向对象中的对扩展开放准则。 * 假设现在我们增加了一种自行车出行的方式。只需新增一个类即可。 */ 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(); }}}
可以看到,应用了策略模式后,如果我们想增加新的出行方式,完全不必要修改现有的类,我们只需要实现策略接口即可,这就是面向对象中的对扩展开放准则。假设现在我们增加了一种自行车出行的方式。只需新增一个类即可。
下面,我们分析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)相关推荐
- Android 9(P)之init进程启动源码分析指南之一
Android 9 之init进程启动源码分析指南之一 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...
- Android 9 (P)之init进程启动源码分析指南之三
Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...
- Android 8.1/9.0 MTK Camera源码分析之录像快门声音控制流程
前面已经针对拍照快门声音控制流程进行了分析,接下来分析一下录像快门声音的控制流程. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程 这两篇文章其实都是相对于手机系统RO ...
- Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程
Android 8.1/9.0 MTK Camera源码分析之快门声音控制 在Android 8.1上mtk camera有控制快门声音的接口,但是并没有了控制录像快门声音的接口.之所以会有这个现象, ...
- 解密android日志xlog,XLog 详解及源码分析
一.前言 这里的 XLog 不是微信 Mars 里面的 xLog,而是elvishew的xLog.感兴趣的同学可以看看作者 elvishwe 的官文史上最强的 Android 日志库 XLog.这里先 ...
- 【C++】Android (Light)RefBase-sp-wp引用计数-智能指针源码分析
文章目录 1.RefBase简介 2.RefBase源码分析 3.RefBase使用注意事项 4.总结 1.RefBase简介 什么是RefBase?RefBase是Android中的一个C++类,用 ...
- 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )
文章目录 一.Protobuf 源码分析 二.创建 Protobuf 对象 三.完整代码示例 四.参考资料 一.Protobuf 源码分析 Protobuf 源文件如下 : addressbook.p ...
- Android SQLite多线程读写和线程同步源码分析
没啥诀窍,只需保证几个线程都是用的一个SQLiteDataBase对象就行了. 如果我们非要在不同线程中用两个或更多的SQLiteDataBase对象呢,当然这些SQLiteDataBase对象所操作 ...
- 【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. ...
- Android基础-Facebook Rebound 弹性动画库 源码分析
Facebook Rebound 弹性动画库 源码分析 设计的时候老是闲动画太生硬,于是找到了这个弹性动画.这个弹性动画是facebook开源的,Rebound项目地址:https://github. ...
最新文章
- 微软开放 .NET 框架源代码
- 教你简单解决过拟合问题(附公式)
- JOGL java调用openGL
- WCF+Silverlight部署本机备忘
- 重庆python就业工资待遇-重庆python培训多少钱?
- 沙家浜《智斗》系列,孩儿版。三、棋手
- 「读懂源码系列2」我从 lodash 源码中学到的几个知识点
- 计算机二级ppt为客户制作演示文稿,计算机二级ppt真题:制作介绍北京ppt
- 《程序是怎样跑起来的》读书笔记——第三章 计算机进行小数运算时出错的原因...
- android自定义渐变色圆环,CircleShape渐变颜色圆环
- token 的设计方案,这个厉害!
- Python 判断字符属于数字、字母、空格
- BATJTMD,大厂招聘,都怎么面Java程序员?
- 广播风暴和环路是什么
- 揭开JS无埋点技术的神秘面纱
- 关于彭先生和我的未来呀~
- 令人匪夷所思的 Magic 之魔数,你真的不会
- 碎片化学习三款必备APP
- ​想知道与你最般配的伴侣长什么样?这个“夫妻相”生成器要火
- 关于IE浏览器打开部分页面的开发人员工具时闪退打不开的问题