Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android常用设计模式

Android常用设计模式速查一览表

作者:事圆则缓

设计模式是针对软件设计中常见问题的可重用解决方案,在Android开发中,合理使用设计模式可以提高代码的可维护性、可扩展性和可测试性,这篇文章主要介绍了Android常用设计模式的相关资料,需要的朋友可以参考下

本文整理 Android 开发中常见技术点对应的设计模式,并给出简化伪代码、典型源码/原理使用位置。伪代码用于理解模式结构,不等同于源码实现。

总览

设计模式Android 常见技术点典型使用位置
单例模式全局管理器、系统服务、数据库实例WorkManager.getInstance()Room.databaseBuilder() 后的数据库单例、SystemServiceRegistry
Builder 模式复杂对象构建AlertDialog.BuilderNotificationCompat.BuilderRoom.databaseBuilder()
工厂模式对象创建解耦LayoutInflater.Factory2FragmentFactoryViewModelProvider.Factory
观察者模式数据变化通知、生命周期感知LiveData.observe()LifecycleObserverFlow.collect
适配器模式数据和 UI 解耦RecyclerView.AdapterListAdapterCursorAdapter
代理模式IPC、远程服务、本地接口代理Binder 的 Stub / Proxy、AIDL
装饰器模式包装并增强能力ContextWrapperContextThemeWrapperInputStream 包装链
外观模式简化复杂子系统访问ContextCameraXGlide.with()
模板方法模式固定流程中暴露可重写步骤Activity 生命周期、View.draw()ViewGroup.dispatchDraw()
策略模式可替换算法或行为RecyclerView.LayoutManagerItemAnimatorDiffUtil.ItemCallback
责任链模式事件分发、拦截链触摸事件分发、OkHttp Interceptor
状态模式对象行为随状态变化Lifecycle.State、播放器状态、登录状态
命令模式把操作封装为对象Runnable + HandlerPendingIntent、点击事件回调
MVC / MVP / MVVM应用架构分层Activity/FragmentViewModelLiveData/StateFlow、Repository

1. 单例模式 Singleton

使用场景

Android 中的例子

伪代码

class AppDatabase private constructor() {
    companion object {
        @Volatile
        private var instance: AppDatabase? = null

        fun getInstance(): AppDatabase {
            return instance ?: synchronized(this) {
                instance ?: AppDatabase().also { instance = it }
            }
        }
    }
}

源码 / 原理标注

2. Builder 模式

使用场景

Android 中的例子

伪代码

class Dialog private constructor(
    val title: String?,
    val message: String?,
    val cancelable: Boolean
) {
    class Builder {
        private var title: String? = null
        private var message: String? = null
        private var cancelable: Boolean = true

        fun setTitle(value: String) = apply { title = value }
        fun setMessage(value: String) = apply { message = value }
        fun setCancelable(value: Boolean) = apply { cancelable = value }

        fun build(): Dialog {
            return Dialog(title, message, cancelable)
        }
    }
}

源码 / 原理标注

3. 工厂模式 Factory

使用场景

Android 中的例子

伪代码

interface ViewModelFactory {
    fun <T : ViewModel> create(modelClass: Class<T>): T
}

class UserViewModelFactory(
    private val repository: UserRepository
) : ViewModelFactory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass == UserViewModel::class.java) {
            return UserViewModel(repository) as T
        }
        error("Unknown ViewModel")
    }
}

源码 / 原理标注

4. 观察者模式 Observer

使用场景

Android 中的例子

伪代码

class ObservableData<T> {
    private val observers = mutableListOf<(T) -> Unit>()
    private var value: T? = null

    fun observe(observer: (T) -> Unit) {
        observers += observer
        value?.let(observer)
    }

    fun setValue(newValue: T) {
        value = newValue
        observers.forEach { it(newValue) }
    }
}

源码 / 原理标注

5. 适配器模式 Adapter

使用场景

Android 中的例子

伪代码

class UserAdapter(
    private val users: List<User>
) : RecyclerView.Adapter<UserViewHolder>() {

    override fun getItemCount(): Int {
        return users.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
        return UserViewHolder(parent.inflate("item_user"))
    }

    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        holder.bind(users[position])
    }
}

源码 / 原理标注

6. 代理模式 Proxy

使用场景

Android 中的例子

伪代码

interface IUserService {
    fun getUserName(id: Long): String
}

class UserServiceProxy(
    private val remoteBinder: Binder
) : IUserService {
    override fun getUserName(id: Long): String {
        val data = Parcel.obtain()
        val reply = Parcel.obtain()
        data.writeLong(id)
        remoteBinder.transact(CODE_GET_USER, data, reply, 0)
        return reply.readString()
    }
}

源码 / 原理标注

7. 装饰器模式 Decorator

使用场景

Android 中的例子

伪代码

open class BaseContext {
    open fun getThemeName(): String = "Default"
}

open class ContextWrapper(
    private val base: BaseContext
) : BaseContext() {
    override fun getThemeName(): String {
        return base.getThemeName()
    }
}

class ThemeContextWrapper(
    base: BaseContext,
    private val theme: String
) : ContextWrapper(base) {
    override fun getThemeName(): String {
        return theme
    }
}

源码 / 原理标注

8. 外观模式 Facade

使用场景

Android 中的例子

伪代码

class ImageLoaderFacade(
    private val cache: ImageCache,
    private val network: ImageNetwork,
    private val decoder: ImageDecoder
) {
    fun load(url: String, imageView: ImageView) {
        val bytes = cache.get(url) ?: network.download(url)
        val bitmap = decoder.decode(bytes)
        imageView.setImageBitmap(bitmap)
    }
}

源码 / 原理标注

9. 模板方法模式 Template Method

使用场景

Android 中的例子

伪代码

abstract class BaseActivity {
    fun performCreate() {
        attachBaseContext()
        onCreate()
        restoreState()
    }

    protected open fun attachBaseContext() {}
    protected abstract fun onCreate()
    protected open fun restoreState() {}
}

class MainActivity : BaseActivity() {
    override fun onCreate() {
        setContentView("activity_main")
    }
}

源码 / 原理标注

10. 策略模式 Strategy

使用场景

Android 中的例子

伪代码

interface SortStrategy {
    fun sort(items: List<Item>): List<Item>
}

class TimeSortStrategy : SortStrategy {
    override fun sort(items: List<Item>) = items.sortedBy { it.time }
}

class NameSortStrategy : SortStrategy {
    override fun sort(items: List<Item>) = items.sortedBy { it.name }
}

class ItemController(
    private var strategy: SortStrategy
) {
    fun render(items: List<Item>) {
        show(strategy.sort(items))
    }
}

源码 / 原理标注

11. 责任链模式 Chain of Responsibility

使用场景

Android 中的例子

伪代码

abstract class EventNode {
    var next: EventNode? = null

    fun dispatch(event: MotionEvent): Boolean {
        if (handle(event)) {
            return true
        }
        return next?.dispatch(event) ?: false
    }

    protected abstract fun handle(event: MotionEvent): Boolean
}

源码 / 原理标注

12. 状态模式 State

使用场景

Android 中的例子

伪代码

interface PlayerState {
    fun play(player: Player)
    fun pause(player: Player)
}

class IdleState : PlayerState {
    override fun play(player: Player) {
        player.prepare()
        player.state = PlayingState()
    }

    override fun pause(player: Player) {
        // Idle 状态下无需处理
    }
}

class PlayingState : PlayerState {
    override fun play(player: Player) {}

    override fun pause(player: Player) {
        player.pauseInternal()
        player.state = PausedState()
    }
}

源码 / 原理标注

13. 命令模式 Command

使用场景

Android 中的例子

伪代码

interface Command {
    fun execute()
}

class SaveUserCommand(
    private val repository: UserRepository,
    private val user: User
) : Command {
    override fun execute() {
        repository.save(user)
    }
}

class CommandQueue {
    private val commands = ArrayDeque<Command>()

    fun enqueue(command: Command) {
        commands.addLast(command)
    }

    fun runNext() {
        commands.removeFirstOrNull()?.execute()
    }
}

源码 / 原理标注

14. MVC / MVP / MVVM 架构模式

使用场景

Android 中的例子

伪代码

class UserViewModel(
    private val repository: UserRepository
) : ViewModel() {
    private val _uiState = MutableStateFlow<UserUiState>(UserUiState.Loading)
    val uiState: StateFlow<UserUiState> = _uiState

    fun loadUser(id: Long) {
        viewModelScope.launch {
            _uiState.value = UserUiState.Loading
            _uiState.value = runCatching {
                repository.getUser(id)
            }.fold(
                onSuccess = { UserUiState.Content(it) },
                onFailure = { UserUiState.Error(it.message.orEmpty()) }
            )
        }
    }
}

class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels()

    fun render() {
        collect(viewModel.uiState) { state ->
            when (state) {
                is UserUiState.Loading -> showLoading()
                is UserUiState.Content -> showUser(state.user)
                is UserUiState.Error -> showError(state.message)
            }
        }
    }
}

源码 / 原理标注

15. 组合模式 Composite

使用场景

Android 中的例子

伪代码

abstract class UiNode {
    abstract fun draw()
}

class TextNode : UiNode() {
    override fun draw() {
        drawText()
    }
}

class ContainerNode : UiNode() {
    private val children = mutableListOf<UiNode>()

    fun add(child: UiNode) {
        children += child
    }

    override fun draw() {
        children.forEach { it.draw() }
    }
}

源码 / 原理标注

16. 享元模式 Flyweight

使用场景

Android 中的例子

伪代码

class BitmapPool {
    private val cache = mutableMapOf<String, Bitmap>()

    fun get(key: String, loader: () -> Bitmap): Bitmap {
        return cache[key] ?: loader().also { bitmap ->
            cache[key] = bitmap
        }
    }
}

源码 / 原理标注

记忆方式

你在做什么常见模式
创建复杂对象Builder
控制对象唯一Singleton
把创建权交出去Factory
数据变了通知 UIObserver
数据接到列表控件Adapter
跨进程像本地调用Proxy
包一层增强功能Decorator
给复杂系统一个简单入口Facade
框架定流程,业务填步骤Template Method
替换算法或行为Strategy
请求一路传递Chain of Responsibility
不同状态不同行为State
操作排队或延迟执行Command
树形 UI 统一处理Composite
大量对象共享复用Flyweight

学习建议

到此这篇关于Android常用设计模式速查一览表的文章就介绍到这了,更多相关Android常用设计模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文