Android设计模式应用举例

本文详细介绍了设计模式在Android开发中的应用,包括创建型模式如单例、工厂、建造者等,结构型模式如适配器、装饰器、代理等,以及行为型模式如观察者、策略、模板方法等。文章列举了Android系统和常见库中如Retrofit、Glide、LiveData等如何运用这些模式,并给出了具体实例,强调了设计模式在提高代码可维护性和灵活性方面的重要性。
摘要由CSDN通过智能技术生成

设计模式概述

设计模式是在软件工程中广泛使用的解决特定问题的经过实践验证的最佳实践方法。下面是一些主流的设计模式:

  1. 创建型模式:创建型模式涉及处理对象创建机制,旨在帮助在创建对象时提供更好的灵活性和复用性。这些模式包括:工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式。

  2. 结构型模式:结构型模式涉及处理对象之间的关系,以便更好地协作。这些模式包括:适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。

  3. 行为型模式:行为型模式涉及处理对象之间的通信方式,以便更好地协作。这些模式包括:责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。

主流的8个设计模式

以下是使用频率较高的8个设计模式:

  • 单例模式:确保一个类只有一个实例,并提供全局访问点。

  • 工厂模式:提供一种创建对象的接口,但不暴露对象的创建逻辑,并允许子类决定实例化哪个类。

  • 适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式可以让原本不兼容的类可以一起工作。

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

  • 策略模式:定义一系列算法,将每个算法封装起来,并使它们可以互换。

  • 命令模式:将请求封装成一个对象,从而使您可以使用不同的请求,队列或日志请求参数化其他对象,并支持可撤销操作。

  • 模板方法模式:定义一个算法的骨架,将一些步骤延迟到子类中。模板方法模式使得子类可以不改变算法的结构即可重定义该算法的某些步骤。

  • 装饰器模式:动态地将责任附加到对象上。装饰器模式提供了一种灵活的方式来扩展类功能,而不需要通过继承来实现。

Android下设计模式的使用

单例模式

  • Application 类:在 Android 应用程序中,Application 类是一个全局的单例对象,用于保存应用程序级别的状态和数据。

  • SharedPreferences 类:SharedPreferences 类是 Android 提供的一种轻量级的数据存储方式,它通过单例模式来确保在整个应用程序中只有一个 SharedPreferences 实例。

  • ActivityManager 类:ActivityManager 类是 Android 提供的一个用于管理应用程序中 Activity 生命周期的类,它使用单例模式确保在整个应用程序中只有一个 ActivityManager 实例。

  • Toast 类:Toast 类是 Android 提供的一个用于在应用程序中显示短暂消息的类,它使用单例模式确保在整个应用程序中只有一个 Toast 实例。

  • LayoutInflater 类:LayoutInflater 类是 Android 提供的一个用于将 XML 布局文件转换为视图对象的类,它使用单例模式确保在整个应用程序中只有一个 LayoutInflater 实例。

工厂模式

  • Retrofit 库:Retrofit 是一个用于创建和使用 RESTful API 的库,它使用工厂模式来创建和管理不同的 API 实例。

  • Glide 库:Glide 是一个用于加载和显示图片的库,它使用工厂模式来创建和管理不同的图片加载器和解码器。

  • Gson 库:Gson 是一个用于将 JSON 数据转换为 Java 对象的库,它使用工厂模式来创建和管理不同的 GsonBuilder 实例。

  • OkHttp 库:OkHttp 是一个用于创建和使用 HTTP 请求的库,它使用工厂模式来创建和管理不同的 OkHttpClient 实例。

  • ViewModelProviders 类:ViewModelProviders 是 Android 架构组件中的一个类,它使用工厂模式来创建和管理不同的 ViewModel 实例。

适配器模式

  • RecyclerView 库:RecyclerView 是 Android 提供的一个用于实现灵活的列表和网格布局的库,它使用适配器模式来将数据和视图进行绑定。

  • ArrayAdapter 类:ArrayAdapter 是 Android 提供的一个用于将数组数据显示为 ListView 列表项的适配器,它使用适配器模式将数组数据和列表项视图进行绑定。

  • PagerAdapter 类:PagerAdapter 是 Android 提供的一个用于将多个视图组合成滑动页面的适配器,它使用适配器模式将视图和数据进行绑定。

  • CursorAdapter 类:CursorAdapter 是 Android 提供的一个用于将数据库中的数据显示为 ListView 列表项的适配器,它使用适配器模式将数据库数据和列表项视图进行绑定。

  • BaseExpandableListAdapter 类:BaseExpandableListAdapter 是 Android 提供的一个用于实现可扩展的列表视图的适配器,它使用适配器模式将数据和视图进行绑定。

观察者模式

  • LiveData 类:LiveData 是 Android 架构组件中的一个类,它使用观察者模式来实现数据的自动更新和刷新。

  • BroadcastReceiver 类:BroadcastReceiver 是 Android 提供的一个用于接收广播消息的类,它使用观察者模式来接收和处理广播消息。

  • ContentObserver 类:ContentObserver 是 Android 提供的一个用于监控数据变化的类,它使用观察者模式来接收和处理数据变化通知。

  • View.OnClickListener 接口:View.OnClickListener 是 Android 提供的一个用于处理视图点击事件的接口,它使用观察者模式来接收和处理视图的点击事件。

  • TextWatcher 接口:TextWatcher 是 Android 提供的一个用于监听文本输入变化的接口,它使用观察者模式来接收和处理文本输入的变化。

策略模式

  • Exoplayer 库:Exoplayer 是 Android 提供的一个用于播放音频和视频的库,它使用策略模式来实现不同的播放策略,例如播放本地文件、HLS、DASH、SmoothStreaming 等。

  • Retrofit 库:Retrofit 是 Android 提供的一个用于网络请求的库,它使用策略模式来实现不同的网络请求策略,例如使用 OkHttp 或者 Volley 来进行网络请求。

  • RecyclerView 库:RecyclerView 是 Android 提供的一个用于实现灵活的列表和网格布局的库,它使用策略模式来实现不同的布局策略,例如线性布局、网格布局、瀑布流布局等。

  • FragmentPagerAdapter 类:FragmentPagerAdapter 是 Android 提供的一个用于将多个 Fragment 组合成滑动页面的适配器,它使用策略模式来实现不同的 Fragment 页面切换策略,例如使用 ViewPager 或者 TabLayout 来进行页面切换。

策略模式——例子:

在 Retrofit 中,通过 OkHttpClient 来进行网络请求,而 OkHttpClient 可以通过 OkHttpClient.Builder 进行构建,其中可以设置不同的策略来实现不同的功能。这个过程涉及到策略模式的应用。

具体来说,OkHttpClient.Builder 通过设置不同的拦截器(Interceptor)来实现不同的策略,比如设置网络请求的超时时间、添加公共请求头、添加缓存等等。而 OkHttpClient.Builder 还提供了 addInterceptor 和 addNetworkInterceptor 方法,让开发者可以自定义拦截器来实现自己的策略。

举个例子,比如下面的代码实现了一个自定义的 Interceptor,可以对所有请求添加一个名为 “Authorization” 的请求头:

class AuthInterceptor(private val token: String) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val newRequest = request.newBuilder()
            .addHeader("Authorization", "Bearer $token")
            .build()
        return chain.proceed(newRequest)
    }
}

然后可以通过 OkHttpClient.Builder 的 addInterceptor 方法来添加这个自定义的 Interceptor:

val client = OkHttpClient.Builder()
    .addInterceptor(AuthInterceptor("my_token"))
    .build()

这样在发起网络请求时,就会自动为所有的请求添加一个 “Authorization” 请求头,实现了对所有请求添加同一个请求头的策略。这里的 AuthInterceptor 就是策略模式中的策略(Strategy),而 OkHttpClient.Builder 就是策略模式中的上下文(Context)

命令模式

  • Handler 类:Handler 是 Android 提供的一个用于发送和处理消息的类,它使用命令模式来实现将消息封装成命令对象,然后将命令对象添加到消息队列中等待处理。

  • BroadcastReceiver 类:BroadcastReceiver 是 Android 提供的一个用于接收广播消息的类,它使用命令模式来实现将广播消息封装成命令对象,然后将命令对象传递给相应的处理程序进行处理。

  • MenuItem.OnMenuItemClickListener 接口:MenuItem.OnMenuItemClickListener 是 Android 提供的一个用于处理菜单项点击事件的接口,它使用命令模式来实现将菜单项点击事件封装成命令对象,然后将命令对象传递给相应的处理程序进行处理。

  • Notification.Action 类:Notification.Action 是 Android 提供的一个用于创建通知栏操作的类,它使用命令模式来实现将通知栏操作封装成命令对象,然后将命令对象传递给相应的处理程序进行处理。

模版方法模式

  • AsyncTask 类:AsyncTask 是 Android 提供的一个用于在后台执行异步任务的类,它使用模板方法模式来实现将异步任务的执行流程封装成模板方法,然后在子类中实现具体的异步任务。

  • RecyclerView.Adapter 类:RecyclerView.Adapter 是 Android 提供的一个用于实现灵活的列表和网格布局的适配器类,它使用模板方法模式来实现将列表和网格布局的创建流程封装成模板方法,然后在子类中实现具体的列表项或网格项。

  • HandlerThread 类:HandlerThread 是 Android 提供的一个用于创建带有消息循环的线程的类,它使用模板方法模式来实现将消息循环的执行流程封装成模板方法,然后在子类中实现具体的消息处理逻辑。

例子

AsyncTask是Android中一个经典的异步任务处理类,它的实现使用了模版方法模式。在AsyncTask中,定义了三个泛型类型Params、Progress和Result,用于指定异步任务执行时的参数类型、进度类型和返回结果类型。AsyncTask的主要方法是doInBackground()、onPreExecute()、onPostExecute()、onProgressUpdate()等,这些方法构成了AsyncTask的执行流程。

在AsyncTask中,doInBackground()方法是必须实现的,它是异步执行的核心方法,在这个方法中可以执行耗时的操作,比如网络请求等。onPreExecute()和onPostExecute()方法分别在doInBackground()方法执行前和执行后在UI线程中执行,用于进行一些UI的更新操作,比如进度条的显示、隐藏等。onProgressUpdate()方法则在异步任务执行中,可以用来更新进度。

AsyncTask中,这些方法的执行顺序是固定的,这就是模版方法模式的体现。同时,AsyncTask也提供了一些回调方法,可以让开发者在适当的时候进行自定义操作,比如cancel()方法可以取消异步任务的执行,onCancelled()方法则在异步任务被取消时执行。

装饰着模式

  • LayoutInflater 类:LayoutInflater 是 Android 提供的一个用于从布局文件中创建视图的类,它使用装饰器模式来实现将视图的创建过程封装成一个装饰器链,然后在链的末尾添加特定的装饰器,以实现自定义的视图创建过程。

  • InputStream 和 OutputStream 类:InputStream 和 OutputStream 是 Java 提供的用于读取和写入数据的抽象类,它们使用装饰器模式来实现将数据读取和写入的过程封装成一个装饰器链,然后在链的末尾添加特定的装饰器,以实现自定义的数据读取和写入过程。

  • RecyclerView.ItemDecoration 类:RecyclerView.ItemDecoration 是 Android 提供的一个用于为 RecyclerView 添加装饰的类,它使用装饰器模式来实现将装饰的绘制过程封装成一个装饰器链,然后在链的末尾添加特定的装饰器,以实现自定义的装饰绘制过程。

责任链模式

  • Android View 事件传递机制:Android 中的 View 事件传递机制是一种典型的责任链模式的实现。当用户触摸屏幕时,事件会从根 View 开始,逐级传递给子 View,直到找到一个能够处理该事件的 View。

  • OkHttp 拦截器(Interceptor):OkHttp 是一个常用的网络请求框架,其中的拦截器(Interceptor)就是一个典型的责任链模式的实现。在 OkHttp 的网络请求过程中,每个拦截器都可以对请求或响应进行处理,然后决定是否将请求或响应交给下一个拦截器。

  • EventBus 事件传递机制:EventBus 是一个常用的事件总线库,其中的事件传递机制也是一个典型的责任链模式的实现。当一个事件被发布时,EventBus 会将事件依次传递给注册了相应事件的订阅者,直到找到一个订阅者处理该事件。

代理模式

  • Service 代理模式:在 Android 中,Service 是一个常用的组件,它可以在后台运行长时间的任务。Android 系统提供了一种基于 Binder 机制的 Service 代理模式,即通过 IBinder 接口来实现 Service 的远程调用。客户端通过代理对象调用远程 Service 的方法,代理对象会将请求发送到服务端的 Binder 对象,然后返回结果给客户端。

  • ContentProvider 代理模式:在 Android 中,ContentProvider 是一种常用的数据共享组件,它可以提供数据的访问和修改接口,其他应用程序可以通过 ContentResolver 对象来访问 ContentProvider 中的数据。ContentResolver 是一个代理对象,它会将请求发送到 ContentProvider 中,并将结果返回给客户端。

  • 动态代理模式:在 Android 中,我们可以使用 Java 的动态代理模式来动态地创建代理对象。Android 中的注解框架 Butter Knife 就是一个使用了动态代理模式的例子。Butter Knife 提供了一个注解 @BindView,可以将视图绑定到代码中的字段,当视图被点击时,Butter Knife 会动态地创建一个代理对象来处理点击事件。

不常用的设计模式:

原型模式

  • Bundle类:Bundle类实现了Cloneable接口,可以通过clone()方法创建一个新的Bundle对象,新的对象与原对象具有相同的键值对。

  • Intent类:Intent类同样实现了Cloneable接口,可以通过clone()方法创建一个新的Intent对象,新的对象与原对象具有相同的数据和组件。

  • Drawable类:在Android开发中,经常会使用Drawable对象来绘制UI元素。Drawable类同样实现了Cloneable接口,可以通过clone()方法创建一个新的Drawable对象,新的对象与原对象具有相同的状态和绘制内容。

桥接模式

桥接模式(Bridge Pattern)将抽象部分与它的实现部分分离,使它们都可以独立的变化。在 Android 开发中,一个典型的桥接模式的应用场景是 View 和 Window 的关系。具体来说,View 定义了一些抽象的操作和属性,比如大小、位置、背景色等等,而 Window 则提供了具体的实现,比如如何将 View 绘制到屏幕上。这两部分的关系是通过桥接模式进行连接的,从而使得两者可以独立的变化。

在 Android 系统中,View 和 Window 的关系由 ViewRootImpl 类来实现。ViewRootImpl 负责将 View 层级结构绘制到 Window 上,并且管理 View 的触摸事件、键盘事件等输入事件。其中,ViewRootImpl 充当了桥梁的角色,它将 View 和 Window 分别抽象出来,使得它们可以独立的变化。通过桥接模式,View 和 Window 可以分别演化为不同的子类,而且它们的组合方式也可以随意的变化,比如一个 View 可以同时显示在多个 Window 上,或者一个 Window 中可以包含多个不同类型的 View。

桥接模式-例子

假设我们正在开发一个画图应用,其中包含许多不同的形状,如圆形、矩形、三角形等。我们希望在不同的操作系统上运行此应用程序,并且我们知道每个操作系统都有其自己的方式来绘制图形。如果我们使用继承来实现这个需求,那么每个形状都需要实现所有操作系统的绘制方法,这样会导致代码量增加、难以维护。这时候,我们可以使用桥接模式来解决这个问题。

在桥接模式中,我们将抽象部分和实现部分分离开来,使它们能够独立地变化。在这个例子中,我们可以定义一个抽象的 Shape 类来表示一个形状,其中包含一个指向实现绘制的 DrawAPI 接口的引用。然后我们可以创建具体的形状类,并将其与具体的绘制方法实现绑定起来。这样,我们就可以在运行时选择不同的绘制方法,而不必修改形状的代码。

下面是一个简单的代码示例:

// 定义实现绘制的接口
interface DrawAPI {
    fun drawCircle(x: Int, y: Int, radius: Int)
}

// 定义具体的绘制方法实现
class RedCircle : DrawAPI {
    override fun drawCircle(x: Int, y: Int, radius: Int) {
        println("Drawing Circle[ color: red, radius: $radius, x: $x, y: $y]")
    }
}

class GreenCircle : DrawAPI {
    override fun drawCircle(x: Int, y: Int, radius: Int) {
        println("Drawing Circle[ color: green, radius: $radius, x: $x, y: $y]")
    }
}

// 定义形状抽象类,包含一个绘制接口引用
abstract class Shape(val drawAPI: DrawAPI) {
    abstract fun draw()
}

// 定义具体的形状类,将其与具体的绘制方法实现绑定起来
class Circle(val x: Int, val y: Int, val radius: Int, drawAPI: DrawAPI) : Shape(drawAPI) {
    override fun draw() {
        drawAPI.drawCircle(x, y, radius)
    }
}

// 使用示例
val redCircle = Circle(100, 100, 10, RedCircle())
redCircle.draw()

val greenCircle = Circle(200, 200, 20, GreenCircle())
greenCircle.draw()

在这个例子中,DrawAPI 接口表示实现绘制的方法,RedCircle 和 GreenCircle 类实现了具体的绘制方法。Shape 抽象类包含一个指向 DrawAPI 接口的引用,并定义了一个抽象的 draw() 方法。Circle 类继承自 Shape 类,并将其与具体的绘制方法实现绑定

组合模式

  • ViewGroup 类和其子类:ViewGroup 是 Android 中所有布局的基类,包括 LinearLayout、RelativeLayout、FrameLayout 等。这些布局都是由一些简单的 View 组合而成的,每个 View 可以是一个基本的组件(如 TextView、ImageView 等),也可以是一个复合组件(如 RecyclerView、ViewPager 等)。

  • Fragment 类和其子类:Fragment 是 Android 中构建可重用组件的一种方式。Fragment 可以包含其他 Fragment 或 View,因此它们可以很方便地实现组合模式。

  • RecyclerView.Adapter 类和其子类:RecyclerView 是 Android 中用于构建列表的一种控件,它的 Adapter 是用于填充列表数据的重要组件。RecyclerView.Adapter 中的 getItemViewType() 方法就是一个典型的组合模式的实现,它根据不同的数据类型返回不同的布局类型。

  • Notification.Builder 类:Notification.Builder 是 Android 用于创建通知的一个工具类,它可以将多个简单组件组合成一个复合通知,具有一致的使用方式。例如,可以将文本、图标和按钮组合在一起,创建一个可交互的通知。

享元模式

享元模式是一种用于优化对象的创建和使用的设计模式,其核心思想是共享对象,以减少内存的占用。

在 Android 开源库中,一个典型的使用享元模式的例子是 Bitmap 内存缓存。在 Android 中,加载大图需要占用大量内存,如果不加以限制,容易导致内存溢出或者 OOM 错误。因此,Android 中提供了一种内存缓存机制来缓存 Bitmap 对象。而为了提高内存缓存的效率,可以采用享元模式来复用已经创建的 Bitmap 对象,避免重复创建新的 Bitmap 对象。

具体地,可以使用 LruCache 数据结构来实现 Bitmap 内存缓存,并使用 Bitmap 对象的 hashCode 作为 key 值,将 Bitmap 对象作为 value 值进行缓存。当需要从内存缓存中获取 Bitmap 对象时,可以先通过 Bitmap 对象的 hashCode 计算出对应的 key 值,然后从 LruCache 中查询是否存在该 key 值,如果存在,则返回缓存的 Bitmap 对象,否则再从磁盘缓存或者网络中加载 Bitmap 对象,并将其添加到 LruCache 中进行缓存,以便下次复用。这样,就可以充分利用已经创建的 Bitmap 对象,减少内存的占用。

外观模式

外观模式是一种结构型设计模式,它提供了一个简单的接口,用于访问一个复杂系统的多个子系统。

通常情况下,一个系统可能包含多个子系统或者模块,而这些子系统之间可能存在复杂的依赖关系和交互逻辑。如果直接访问这些子系统,会导致代码复杂度增加、维护难度增大等问题。外观模式可以将这些子系统封装起来,提供一个简单的接口,让客户端可以方便地访问这些子系统,从而降低代码复杂度,提高系统的可维护性。

在外观模式中,通常会定义一个外观类(Facade),它封装了子系统的复杂逻辑,并提供了一个简单的接口,供客户端调用。客户端只需要通过外观类访问子系统,而不需要了解子系统的具体实现细节。

  • Android系统的PackageManager类提供了一个外观模式,用于对应用程序包的管理。它隐藏了与安装、卸载、启动和停止应用程序包相关的复杂细节,并提供了简单的API来完成这些任务。

  • Android系统的MediaRecorder类是一个外观模式,提供了一个简单的接口来录制音频和视频。它隐藏了与底层媒体框架的交互,并提供了一个易于使用的API。

  • Android系统的TelephonyManager类是一个外观模式,提供了对设备通信功能的访问。它隐藏了与不同类型的通信技术(如GSM、CDMA等)的交互,并提供了一个简单的API来完成通信任务。

  • Android系统的AlertDialog类是一个外观模式,提供了一个简单的接口来创建对话框。它隐藏了与对话框样式和布局相关的复杂细节,并提供了一个易于使用的API来创建对话框。

  • Android系统的NotificationManager类是一个外观模式,提供了一个简单的接口来创建和管理通知。它隐藏了与通知样式和布局相关的复杂细节,并提供了一个易于使用的API来创建和管理通知。

迭代器模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种有效的方式来访问集合对象中的元素,而不需要暴露其底层的表示方式。该模式中,迭代器对象用于顺序地访问集合中的元素,而不会暴露集合的内部结构。

迭代器模式主要包含以下几个角色:

抽象迭代器(Iterator):定义了访问和遍历集合元素的接口。
具体迭代器(ConcreteIterator):实现迭代器接口,包含了对集合的具体遍历算法。
抽象聚合类(Aggregate):定义了集合对象的接口,其中包含了创建迭代器对象的方法。
具体聚合类(ConcreteAggregate):实现了抽象聚合类中定义的接口,返回一个具体迭代器实例。

  • Cursor和CursorAdapter: 在Android中,Cursor用于处理查询结果集。CursorAdapter则是将Cursor中的数据绑定到ListView等控件上。这两个类都是使用迭代器模式来遍历数据集合。

  • SharedPreferences: SharedPreferences是Android中的一种轻量级的数据存储方式,通常用于保存应用程序的设置。SharedPreferences的实现中也使用了迭代器模式来遍历数据集合。

  • android.util.SparseArray: SparseArray是一个存储int类型键值对的容器,内部采用了一个int[]数组和一个Object[]数组来存储数据。SparseArray实现了Iterable接口,因此可以使用迭代器模式来遍历数据。

  • android.util.ArrayMap: ArrayMap是一个存储键值对的容器,内部采用了一个数组和一个哈希表来存储数据。ArrayMap实现了Iterable接口,因此可以使用迭代器模式来遍历数据。

中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,它通过将对象间的交互转化为中介者对象的单独交互,从而减少对象之间的耦合度。中介者模式的核心思想是将一组对象之间的交互操作封装在一个中介者对象中,对象之间不再直接相互通信,而是通过中介者对象进行通信和交互。

在中介者模式中,中介者对象负责管理一组相互关联的对象,并且协调它们之间的交互。对象之间不再相互引用,而是通过中介者对象进行通信,这使得对象之间的耦合度降低,从而提高系统的可扩展性和可维护性。

中介者模式通常包含以下角色:

抽象中介者(Mediator):定义了各个同事对象之间的通信接口,负责协调各个同事对象之间的交互关系。
具体中介者(Concrete Mediator):实现抽象中介者定义的通信接口,负责协调各个同事对象之间的交互关系。
抽象同事类(Colleague):定义了同事类之间的通信接口,包含一个指向中介者对象的引用,每个同事对象都知道它的中介者对象。
具体同事类(Concrete Colleague):实现抽象同事类定义的通信接口,在需要和其他同事对象进行通信时,与它的中介者通信。
在Android开发中,常常使用中介者模式来协调复杂组件之间的交互关系,例如MVP架构中Presenter就充当了中介者的角色,协调Model和View之间的交互关系。另外,Android系统中的ActivityManagerService也是一个具体中介者,负责协调Activity、Service、BroadcastReceiver等组件之间的交互。

  • 在 Android 开发中,一个常见的使用中介者模式的场景是使用 LiveData 和 ViewModel。LiveData 作为可观察的数据持有者,可以在数据发生变化时通知观察者(例如 UI 控件)进行相应的更新。ViewModel 作为 UI 控制器和数据层之间的中介者,负责协调数据和 UI 的交互。当数据发生变化时,ViewModel 可以使用 LiveData 来通知 UI 控件进行相应的更新。这种方式可以避免直接将数据层和 UI 控制器紧密耦合在一起,从而使得应用程序的代码更加模块化和可维护。

状态模式

状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。这种模式适用于在对象的状态发生改变时,需要改变对象的行为,并且状态转移的逻辑相对复杂的场景。

状态模式的主要结构包括:上下文(Context)、抽象状态(State)、具体状态(ConcreteState)。其中,上下文类负责维护一个抽象状态对象的引用,并将请求转发到当前状态对象处理;抽象状态类定义了一个接口,用于封装与上下文的一个特定状态相关的行为;具体状态类实现了抽象状态所定义的接口,实现特定状态相关的行为。

在状态模式中,一个对象的行为取决于它的状态,而它的状态又会随着其内部状态的变化而变化,因此状态模式将状态的控制从对象的行为中分离出来,使得状态可以被独立的改变。

在Android开发中,状态模式常常被用于处理UI组件的不同状态下的显示和交互行为。比如在Activity或Fragment中,我们常常需要根据不同的页面状态,控制页面中的不同组件的显示和交互。在这种情况下,我们可以使用状态模式来对页面状态和组件行为进行解耦,使得代码更加灵活和可维护。

  • Android中的Activity生命周期状态:Activity的生命周期状态分为created、started、resumed、paused、stopped和destroyed等几种状态。Activity会根据当前的状态执行不同的操作。

  • Android中的View状态:Android中的View有很多不同的状态,例如VISIBLE、INVISIBLE、GONE、ENABLED、DISABLED等等。View的状态会影响其外观和交互。

  • Android中的MediaPlayer状态:Android中的MediaPlayer类有多种状态,例如Idle、Initialized、Prepared、Started、Paused、Stopped、PlaybackCompleted、Error等等。MediaPlayer在不同的状态下会执行不同的操作。

  • Android中的网络状态:Android中的网络状态包括网络可用性、网络连接类型、网络信号强度等等。在不同的网络状态下,应用程序可以采取不同的措施,例如显示不同的UI、启用/禁用某些功能等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值