安卓开发用到的设计模式(3)行为型模式

安卓开发用到的设计模式(3)行为型模式

文章目录

  • 安卓开发用到的设计模式(3)行为型模式
    • [1. 命令模式(Command Pattern)](#1. 命令模式(Command Pattern))
    • [2. 策略模式(Strategy Pattern)](#2. 策略模式(Strategy Pattern))
    • [3. 观察者模式(Observer Pattern)](#3. 观察者模式(Observer Pattern))
    • [4. 模板方法模式(Template Method Pattern)](#4. 模板方法模式(Template Method Pattern))
    • [5. 责任链模式(Chain of Responsibility Pattern)](#5. 责任链模式(Chain of Responsibility Pattern))
    • [6. 状态模式(State Pattern)](#6. 状态模式(State Pattern))
    • [7. 访问者模式(Visitor Pattern)](#7. 访问者模式(Visitor Pattern))
    • [8. 中介者模式(Mediator Pattern)](#8. 中介者模式(Mediator Pattern))
    • [9. 迭代器模式(Iterator Pattern)](#9. 迭代器模式(Iterator Pattern))
    • [10. 备忘录模式(Memento Pattern)](#10. 备忘录模式(Memento Pattern))
    • [11. 解释器模式(Interpreter Pattern)](#11. 解释器模式(Interpreter Pattern))

本文首发地址 https://h89.cn/archives/399.html

1. 命令模式(Command Pattern)

命令模式将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

在Android中的主要应用场景:

  1. 点击事件处理

    • OnClickListener就是一个典型的命令模式实现。例如,一个按钮的点击事件可以被封装成一个Command对象,当按钮被点击时,执行该Command对象的execute()方法。
    • 将点击事件封装成命令对象,使得事件处理逻辑与UI组件解耦,方便进行单元测试和复用。
  2. 异步任务处理

    • AsyncTask和Handler消息机制。在AsyncTask中,doInBackground()方法封装了需要在后台执行的任务(命令),而onPostExecute()等方法则处理任务执行后的结果。Handler消息机制中的Message对象也可以看作是一种命令,包含了需要处理的数据和逻辑。
    • 将任务封装成命令,实现异步执行、任务排队、取消等操作,提高应用的响应性。

2. 策略模式(Strategy Pattern)

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响到使用算法的客户。

在Android中的主要应用场景:

  1. 动画实现

    • 不同的动画插值器(Interpolator)。例如,LinearInterpolator、AccelerateInterpolator等实现了不同的动画速率变化算法,可以在运行时根据需求选择不同的插值器来改变动画效果。
    • 可以动态切换动画效果,使得动画行为更加灵活。
  2. 图片加载策略

    • 不同的图片加载方式(网络、本地、缓存)。例如,使用Glide、Picasso等图片加载库时,可以配置不同的加载策略(如只从缓存加载、优先从网络加载等),根据网络状态或用户设置动态切换。
    • 根据需求切换加载策略,优化图片加载性能和用户体验。

3. 观察者模式(Observer Pattern)

观察者模式定义了对象之间的一对多依赖,当一个对象状态改变时,其所有依赖者都会收到通知并自动更新。

在Android中的主要应用场景:

  1. 事件总线

    • EventBus、RxBus等事件传递机制。发布者(Subject)在某个事件发生时通知所有订阅者(Observer),订阅者执行相应的处理逻辑。这使得不同组件之间可以通过事件进行通信,而无需直接引用,降低耦合度。
    • 实现组件间的解耦通信,提高代码的可维护性和可扩展性。
  2. 数据绑定

    • LiveData、DataBinding。LiveData作为可观察的数据持有者,当其数据发生变化时,会自动通知所有观察者(通常是UI组件),从而实现数据与UI的自动同步更新。DataBinding则进一步简化了这一过程。
    • 实现数据与UI的自动同步,减少手动更新UI的代码,提高开发效率。

4. 模板方法模式(Template Method Pattern)

模板方法模式定义一个操作中的算法骨架,而将某些步骤延迟到子类中实现。

在Android中的主要应用场景:

  1. Activity生命周期

    • onCreate、onStart、onResume等生命周期方法。Android框架定义了Activity生命周期的骨架,开发者通过重写这些模板方法来插入自定义的逻辑,例如在onCreate()中进行初始化,在onResume()中恢复状态等。
    • 提供固定的执行流程框架,确保Activity在不同状态下执行必要的初始化、暂停、恢复和销毁操作。
  2. AsyncTask

    • doInBackground、onPreExecute、onPostExecute等模板方法。AsyncTask定义了异步任务执行的骨架,doInBackground()是必须由子类实现的抽象方法,用于执行后台耗时操作;onPreExecute()和onPostExecute()是可选重写的方法,用于在任务执行前后更新UI。
    • 规范异步任务的执行流程,简化了在后台线程执行任务并在主线程更新UI的复杂性。

5. 责任链模式(Chain of Responsibility Pattern)

责任链模式为请求创建了一个接收者对象的链,使多个对象都有机会处理请求。请求沿着这条链传递,直到有一个对象处理它为止。每个接收者都包含对下一个接收者的引用。

在Android中的主要应用场景:

  1. 事件分发机制

    • View的事件分发流程。当触摸事件发生时,事件会沿着View树从父View向子View传递。每个View或ViewGroup都可以选择拦截(处理)事件或将其传递给下一个接收者(子View或父View),形成一个责任链。
    • 实现触摸事件的层级传递,每个View或ViewGroup都可以选择处理或传递事件,灵活控制事件的响应。
  2. 拦截器链

    • OkHttp的拦截器链。OkHttp通过拦截器链来处理网络请求,每个拦截器负责处理请求的某个方面(如日志记录、缓存、重定向等)。请求在链中依次传递,每个拦截器执行其逻辑后再将请求传递给下一个拦截器,直到最终发送请求并处理响应。
    • 实现网络请求的处理流程,每个拦截器都可以在请求发送前或响应接收后进行处理或修改,方便实现各种网络功能。

6. 状态模式(State Pattern)

状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

在Android中的主要应用场景:

  1. 播放器状态管理

    • 播放、暂停、停止、缓冲等状态切换。媒体播放器根据当前状态(如Idle、Initialized、Prepared、Started、Paused、Stopped、PlaybackCompleted等)来改变其行为和UI表现。例如,在播放状态显示暂停按钮,在暂停状态显示播放按钮。
    • 不同状态下的UI展示和操作响应,使得播放器的行为符合用户预期。
  2. 网络连接状态

    • 在线、离线、正在连接等状态处理。应用可以根据当前的网络连接状态(如通过ConnectivityManager获取)来调整功能可用性或UI提示。例如,在离线状态下禁用某些需要网络的功能,或显示"无网络连接"的提示。
    • 根据状态调整应用行为,提供更好的用户体验和错误处理。

7. 访问者模式(Visitor Pattern)

访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

在Android中的主要应用场景:

  1. View树遍历

    • 实现自定义View的遍历操作。例如,可以使用访问者模式遍历一个ViewGroup中的所有子View,并对特定类型的View执行操作(如修改属性、收集信息等),而无需在ViewGroup类中硬编码这些操作。
    • 收集或修改View树中的特定元素,提高View树操作的灵活性和可扩展性。
  2. 数据结构访问

    • 对复杂数据结构的统一处理。例如,如果有一个包含多种不同类型对象的列表,可以使用访问者模式定义不同的访问者来处理不同类型的对象,而无需修改这些对象的类。这在处理XML、JSON等结构化数据时很有用。
    • 实现数据的格式转换和导出,方便对不同类型的数据进行统一处理。

8. 中介者模式(Mediator Pattern)

中介者模式用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用,从而使其耦合松散。

在Android中的主要应用场景:

  1. Fragment通信

    • Activity作为中介者协调多个Fragment。在多Fragment的应用中,Fragment之间不应直接通信,而是通过宿主Activity作为中介。Fragment将消息发送给Activity,Activity再将消息转发给目标Fragment,从而降低Fragment之间的耦合。
    • 处理Fragment之间的数据传递和交互,使各Fragment保持独立。
  2. MVVM架构

    • ViewModel作为中介者。在MVVM(Model-View-ViewModel)架构中,ViewModel充当View(Activity/Fragment)和Model(数据层)之间的中介。View通过ViewModel暴露的数据和命令与Model交互,Model的变化通过ViewModel通知View,避免View直接依赖Model。
    • 协调View和Model之间的交互,实现View和Model的解耦。

9. 迭代器模式(Iterator Pattern)

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

在Android中的主要应用场景:

  1. 集合遍历

    • Cursor对数据库查询结果的遍历。Cursor提供了一种顺序访问数据库查询结果集的方式,而无需一次性加载所有数据到内存,隐藏了底层数据存储的细节。
    • RecyclerView.Adapter的数据访问。Adapter通过getItemCount()、getItemViewType()、onBindViewHolder()等方法,以迭代器的方式访问和展示数据集合中的元素,而无需关心数据集合的具体实现。
    • 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
  2. 分页加载

    • 实现数据的分页加载机制。例如,在列表或网格视图中,可以使用迭代器模式按页加载数据,每次只从数据源获取并展示一部分数据,提高性能和用户体验。
    • 管理大量数据的遍历和展示,尤其适用于需要分批加载的场景。

10. 备忘录模式(Memento Pattern)

备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。

在Android中的主要应用场景:

  1. Activity状态保存

    • onSaveInstanceState保存状态。当Activity因配置改变或系统资源不足而被销毁时,可以通过onSaveInstanceState()方法将当前状态(如EditText中的文本、滚动位置等)保存到Bundle对象中。
    • onCreate恢复保存的状态。在Activity重建时,可以在onCreate()方法中从Bundle对象中恢复之前保存的状态,使用户感觉Activity没有中断。
    • 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
  2. 编辑器撤销/重做

    • 保存编辑操作历史。在文本编辑器等应用中,每次用户执行一个编辑操作(如插入、删除文本),都可以将当前文档的状态或操作本身保存为一个备忘录对象。
    • 实现操作的撤销和重做。通过管理这些备忘录对象,可以轻松地将文档恢复到之前的某个状态(撤销)或重新应用某个操作(重做)。

11. 解释器模式(Interpreter Pattern)

解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

在Android中的主要应用场景:

  1. 表达式计算器

    • 解析和计算数学表达式。例如,实现一个简单的计算器应用,可以使用解释器模式将用户输入的数学表达式(如"2 + 3 * 5")解析成抽象语法树,然后通过解释器遍历语法树并计算结果。
    • 自定义公式解析器,方便处理各种复杂的表达式。
  2. 自定义配置解析

    • 解析特定格式的配置文件。如果应用使用自定义格式的配置文件,可以定义一套文法规则和解释器来解析配置文件内容,并将其转换为应用内部的数据结构或配置对象。
    • 处理自定义的领域特定语言(DSL),使得配置或脚本更加灵活和强大.

这些行为型设计模式在Android开发中的应用不仅能够提高代码的复用性和可维护性,还能使代码结构更加清晰。通过合理使用这些模式,我们可以更好地组织代码,提高开发效率,并且使应用程序更容易维护和扩展。在实际开发中,我们应该根据具体场景选择合适的设计模式,避免过度设计,确保代码的简洁性和可读性。


相关系列文章:

相关推荐
静水流深_沧海一粟12 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder12 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿巴斯甜18 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker19 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
阿星AI工作室20 小时前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
xq952720 小时前
Andorid Google 登录接入文档
android
黄林晴21 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android