写点什么

从 Android 系统架构学习设计模式

用户头像
轻口味
关注
发布于: 刚刚

每个开发者都绕不开对设计模式的学习和应用,有时候去面试也会经常被问到用过什么设计模式。相比于死啃定义和书本,从代码角度学习可能是更有效的一种方式。”应用之妙,存乎一心“,从代码里,特别是优秀代码里学习到的可能更能对我们有所启发。作为 Android 开发者,这里我们从 Android 系统架构和提供的功能来看看 23 种设计模式。

单例模式

  1. AOSP 层的 SurfaceComposerClient 对象。

  2. AOSP 层的 SurfaceClient 对象。

工厂模式

简单工厂模式

Android 中最明显的简单工厂模式之一就是获取服务的系统方法“getSystemService”,例如,获得 SensorManager 的具体代码如下所示。


public Object getSystemService(String name) {    if (getBaseContext() == null) {        throw new IllegalStateException("System services not available to Activities before onCreate()");    }    //........    if (WINDOW_SERVICE.equals(name)) {         return mWindowManager;    } else if (SEARCH_SERVICE.equals(name)) {        ensureSearchManager();        return mSearchManager;    }    //.......    return super.getSystemService(name);  }
复制代码

工厂方法模式

在 Android 的 Activity、Service 等核心组件中,都定义了 onCreate()方法,例如,当我们要显示用户界面时,一般都会在 onCreate()使用 setContentView 这个方法,这个方法是在 Activity 中定义的,在编写具体的

抽象工厂模式

在 Android 的应用程序开发中涉及到的 IPC 通信就是抽象工厂模式很好的

构造器模式

  • 在 Android 中,AlertDialog 的构造是建造者模式一个非常经典的实现;

  • 在 JNI 层提供的 AAudio 也用到了构建器模式。

装饰器模式

在 Java I/O 库的设计和实现中就很好地使用了装饰模式。JDK 提供的 java.io 包中使用了 Decorator 模式来实

外观模式

是一种得到广泛应用的模式,例如,我们熟知的 MVC 模式就采用了外观模式。在 MVC 架构模式中,每一层并不需要知道其他层次的细节,只是通过层与层之间的接口调用即可,这极大方便了应用开发

享元模式

使用 Handler 时,会使用 Message,不是直接 new 而是 Message.obtaion().

适配器模式

Android 中的 ListView 和 RecyclerView 是对适配器模式非常好的说明

代理模式

Android 中两个进程间的通信,如 框架在支持 Android 应用程序间的跨进程通信时就是基于 Binder 的,要实现进程间通信的双方只需要遵循共同的 AIDL 接口即可,而在背后是使用了代理模式的,下面举具体的例子说明。

组合模式

Android 中的 View 布局树是组合模式非常生动直观的说明

模板方式模式

Android 中的四大组件的生命周期方法是模板方法模式的绝妙体现。

观察者模式

ListView notifyDataSetChange 函数通知 Item 刷新。

状态模式

Android 的 MediaPlayer 和 MediaRecorder 都应用了状态模式。

策略模式

Android 在属性动画中使用时间插值器的时候就用到了策略模式。在使用动画时,你可以选择线性插值器 LinearInterpolator、加速减速插值器 AccelerateDecelerateInterpolator、减速插值器 DecelerateInterpolator 以及自定义的插值器。这些插值器都是实现根据时间流逝的百分比来计算出当前属性值改变的百分比。通过根据需要选择不同的插值器,实现不同的动画效果。

责任链模式

Android 中触摸事件的分发就是责任链模式很好的例子。

解释器模式

Android 中 PackageManagerService 解析 AndroidManifest.xml 文件就是解释器模式。

命令模式

Android 中 ActivityThread 中的自定义 Handler 对象 H 就是典型的命令模式,接收不同的命令,调用 Activity 对应的方法。

备忘录模式

onSaveInstanceState 和 onRestoreInstanceState 就是用到了备忘录模式,分别用于保存和恢复。

迭代器模式

数据库操作的 Course 以及 Java 提供的各个集合类的迭代器。

访问者模式

Android 中运用访问者模式,其实主要是在编译期注解中,编译期注解核心原理依赖 APT(Annotation Processing Tools)。

中介模式

ActivityManager、WindowManager、ServiceManager 都是用到了中介模式。

装饰模式

那么在 Android 哪里出现了装饰模式呢?我们平时经常用到 Context 类,但是其实 Context 类只是个抽象类,具体实现是 ContextImpl,那么谁是 ContextImpl 的装饰类呢?我们知道 Activity 是个 Context,但是 Activity 并不是继承于 Context,而是继承于 ContextThremeWrapper.而 ContextThremeWrapper 继承于 ContextWrapper,ContextWrapper 继承 Context.说了这么多,跟装饰模式有啥关系?主要是引入 ContextWrapper 这个类。ContextWrapper 内部有个 Context 引用 mContext,并且 ContextWrapper 中对 Context 的每个方法都有实现,在实现中调用的就是 mContext 相同的方法。

桥接模式

在 Android 中桥接模式用的很多,举个例子,对于一个 View 来说,它有两个维度的变化,一个是它的描述比如 Button、TextView 等等他们是 View 的描述维度上的变化,另一个维度就是将 View 真正绘制到屏幕上,这跟 Display、HardwareLayer 和 Canvas 有关。这两个维度可以看成是桥接模式的应用。

发布于: 刚刚阅读数: 2
用户头像

轻口味

关注

🏆2021年InfoQ写作平台-签约作者 🏆 2017.10.17 加入

Android音视频、AI相关领域从业者,开源RTMP播放器:https://github.com/qingkouwei/oarplayer

评论

发布
暂无评论
从Android系统架构学习设计模式