前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 中的那些策略模式

Android 中的那些策略模式

作者头像
张拭心 shixinzhang
发布2022-05-10 08:18:32
4760
发布2022-05-10 08:18:32
举报

上篇文章 策略模式:网络小说的固定套路 介绍了策略模式 的基本概念,这篇文章我们来通过 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

代码地址点这里

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先祭上经典的策略模式 UML 图
    • 可以看到,策略模式中主要有以下几个角色:
      • Context 中引用的是 接口,因此当更换具体实现时,Context 不用修改代码,这就是针对接口编程的好处。
      • 我们可以看到,当更换 Adapter 的具体实现时,仍然调用的是 ListView.setAdapter(…) 方法,查看 ListView 源码,发现 setAdapter 方法的参数是一个 ListAdapter:
      • 可以看到 ListAdapter 是一个接口,ArrayAdapter 和 BaseAdapter 是它的一个实现类。对比文章开始给出的 策略模式 UML 图,可以发现 ListAdapter 就是 strategy 接口,ArrayAdpater 等就是具体的实现类,而在 ListView 中引用的是 接口 ListAdapter,可以证实这就是一个 策略模式 的使用。
      • 跟 ListAdapter 是多么的相似!
      • 通过这两个例子,我的第一感觉是 :
  • 策略模式例子 1 : ListAdapter
  • 策略模式例子2 : TimeInterpolator
  • 总结
    • 策略模式中的“策略”名字都好像啊,后缀都一样!
      • 的确这样,Android 源码中接口与具体实现,或者同样功能的类都会有一些共同的后缀,因此遇到这些名字很像的类,我们就可以考虑下,它们是不是同一问题的不同解决方法呢?
    • 策略模式的定义:
      • 使用场景
        • 优点
        • 缺点
      • 代码地址点这里
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档