上篇文章 策略模式:网络小说的固定套路 介绍了策略模式 的基本概念,这篇文章我们来通过 Android 中的一些例子来加深对策略模式的理解。

首先祭上经典的策略模式 UML 图

可以看到,策略模式中主要有以下几个角色:

  • Strategy 接口,用于定义算法的固定套路
  • ConcreteStrategyA , …..B , 等具体算法实现类
  • Context 外部调用类

Context 中引用的是 接口,因此当更换具体实现时,Context 不用修改代码,这就是针对接口编程的好处。

策略模式例子 1 : ListAdapter

在 RecyclerView 还没火起来前,ListView 是一个很重要的组件,我们通常在布局里写个 ListView 组件,然后在代码中 setAdapter,把 View 与 Model 结合的任务交给了 Adapter。

比如 ListView 要显示的子布局是个简单的文字时,我们可以使用 ArrayAdapter :

要显示复杂些的布局时,就需要用 BaseAdapter

我们可以看到,当更换 Adapter 的具体实现时,仍然调用的是 ListView.setAdapter(…) 方法,查看 ListView 源码,发现 setAdapter 方法的参数是一个 ListAdapter:

继续看 ListAdapter 源码和类结构:

可以看到 ListAdapter 是一个接口,ArrayAdapter 和 BaseAdapter 是它的一个实现类。对比文章开始给出的 策略模式 UML 图,可以发现 ListAdapter 就是 strategy 接口,ArrayAdpater 等就是具体的实现类,而在 ListView 中引用的是 接口 ListAdapter,可以证实这就是一个 策略模式 的使用。

.

策略模式例子2 : TimeInterpolator

时间插值器,它是一个接口,定义了动画改变的速率,允许动画进行非匀速变化。
我们在使用属性动画时,可以根据需要选择合适的时间插值器:

和 ListView 的 setAdapter 一样,ValueAnimator 的 setInterpolator 方法中也引用的是 接口 TimeInterpolator:

TimeInterpolator 源码及类结构:

跟 ListAdapter 是多么的相似!

总结

通过这两个例子,我的第一感觉是 :

策略模式中的“策略”名字都好像啊,后缀都一样!

的确这样,Android 源码中接口与具体实现,或者同样功能的类都会有一些共同的后缀,因此遇到这些名字很像的类,我们就可以考虑下,它们是不是同一问题的不同解决方法呢?

策略模式的定义:

在接口定义了一系列算法,并将每个算法的具体实现封装起来,外部引用的是抽象接口,使得不同算法可以互相替换而不影响客户。

使用场景

在某一场景需要有多种情况,不同情况有不同的处理(大量 if-else 或者 switch),但大致功能是一样的,这时我们可以考虑用策略模式实现。

优点

  • 每个算法都独立于其他,方便单元测试
  • 结构更加清晰,不会像一堆条件语句让你看着头晕
  • 客户端引用的是接口,耦合度更低,扩展性更强

缺点

  • 随着策略增加,子类会增加
  • 但这个不就是设计模式的通病吗?0.0

代码地址点这里



本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 中国大陆许可协议进行许可,未经允许不可擅自转载,转载需标明作者 张拭心 与 原文链接,否则保留追究法律责任的权利!。

更多相关文章

  1. 【Android】第三方QQ账号登录的实现
  2. Android技能树 - Rxjava源码(1) 之 初步结构
  3. Android中ContentProvider和ContentResolver使用入门
  4. Android(安卓)ArrayList LinkedList Set HashMap的介绍.
  5. Android(安卓)A2DP 音频卡顿问题BT HOST策略总结
  6. 详解Android接口Interface的使用和意义
  7. Android运行时权限策略和easyPermission的使用分析
  8. Android(安卓)ndk开发swig编译jni接口配置文件(二)
  9. Android(安卓)Camera 架构简析2

随机推荐

  1. android高版本Toast问题
  2. android的一些动画集合以及layoutAnimati
  3. mac配置android环境(android studio)
  4. Android中XML文件的序列化生成与解析
  5. Android Edittext输入框点击空白处,软键盘
  6. android 监听来电
  7. android中获取IP的方法
  8. Android应用程序 启动画面
  9. Dalvik虚拟机启动全程解析
  10. Android使用MediaStore.ACTION_IMAGE_CAP