44人参与 • 2026-09-05 • Android
本文整理 android 开发中常见技术点对应的设计模式,并给出简化伪代码、典型源码/原理使用位置。伪代码用于理解模式结构,不等同于源码实现。
| 设计模式 | android 常见技术点 | 典型使用位置 |
|---|---|---|
| 单例模式 | 全局管理器、系统服务、数据库实例 | workmanager.getinstance()、room.databasebuilder() 后的数据库单例、systemserviceregistry |
| builder 模式 | 复杂对象构建 | alertdialog.builder、notificationcompat.builder、room.databasebuilder() |
| 工厂模式 | 对象创建解耦 | layoutinflater.factory2、fragmentfactory、viewmodelprovider.factory |
| 观察者模式 | 数据变化通知、生命周期感知 | livedata.observe()、lifecycleobserver、flow.collect |
| 适配器模式 | 数据和 ui 解耦 | recyclerview.adapter、listadapter、cursoradapter |
| 代理模式 | ipc、远程服务、本地接口代理 | binder 的 stub / proxy、aidl |
| 装饰器模式 | 包装并增强能力 | contextwrapper、contextthemewrapper、inputstream 包装链 |
| 外观模式 | 简化复杂子系统访问 | context、camerax、glide.with() |
| 模板方法模式 | 固定流程中暴露可重写步骤 | activity 生命周期、view.draw()、viewgroup.dispatchdraw() |
| 策略模式 | 可替换算法或行为 | recyclerview.layoutmanager、itemanimator、diffutil.itemcallback |
| 责任链模式 | 事件分发、拦截链 | 触摸事件分发、okhttp interceptor |
| 状态模式 | 对象行为随状态变化 | lifecycle.state、播放器状态、登录状态 |
| 命令模式 | 把操作封装为对象 | runnable + handler、pendingintent、点击事件回调 |
| mvc / mvp / mvvm | 应用架构分层 | activity/fragment、viewmodel、livedata/stateflow、repository |
workmanager.getinstance(context)roomdatabase 通常在应用层做单例封装systemserviceregistry 管理系统服务实例application 全局生命周期入口class appdatabase private constructor() {
companion object {
@volatile
private var instance: appdatabase? = null
fun getinstance(): appdatabase {
return instance ?: synchronized(this) {
instance ?: appdatabase().also { instance = it }
}
}
}
}
context.getsystemservice() 背后会从系统服务注册表中按名称获取服务。workmanager 通过 getinstance() 对外提供统一入口,内部保证调度组件可被全局访问。build() 或 create() 生成目标对象。alertdialog.buildernotificationcompat.builderroom.databasebuilder(context, appdatabase::class.java, "db").build()workrequest.builderclass 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)
}
}
}
alertdialog.builder 先收集标题、按钮、布局等配置,最后调用 create() 构建 alertdialog。notificationcompat.builder 把通知图标、标题、内容、渠道等复杂参数集中封装,降低构造复杂度。layoutinflater.factory2 创建 viewfragmentfactory 创建 fragmentviewmodelprovider.factory 创建 viewmodelserviceloader 或依赖注入框架中的对象创建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")
}
}
viewmodelprovider 不知道业务 viewmodel 如何构造,于是通过 factory 把创建过程交给调用方。layoutinflater 解析 xml 时,需要把标签名转换成具体 view 对象,这就是典型的创建型模式场景。fragmentfactory 允许 fragment 使用带参数构造或依赖注入方式创建,避免框架只能调用空构造。livedata.observe(owner, observer)lifecycle.addobserver(observer)stateflow / sharedflowtextwatcher、broadcastreceiverclass 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) }
}
}
livedata 保存观察者列表,数据变化后分发给活跃生命周期状态下的观察者。lifecycleregistry 内部维护观察者,并在 activity / fragment 生命周期变化时派发生命周期事件。broadcastreceiver 可以理解为系统级发布订阅机制,发送广播后匹配的接收者会收到通知。recyclerview.adapterlistadaptercursoradapterpageradapterclass 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])
}
}
recyclerview 不关心数据来源,只依赖 adapter 提供数量、创建 viewholder、绑定数据。cursoradapter 把数据库查询结果 cursor 适配成列表项视图。listadapter 在适配器基础上加入 diffutil,让列表更新更高效。stub 和 proxyactivitymanager、packagemanagerinterface 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()
}
}
stub 和 proxy:本地进程调用接口方法,实际由 proxy 封装参数并通过 binder 发送到远端。proxy 屏蔽了进程边界,让跨进程调用看起来像普通方法调用。contextwrappercontextthemewrapperbufferedinputstream(inputstream)context 和 view 的包装增强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
}
}
contextwrapper 内部持有一个 base context,默认把大部分调用委托给它。contextthemewrapper 在原有 context 基础上叠加主题能力。activity 本身也继承自 contextthemewrapper,因此具备上下文和主题相关能力。context 封装资源、文件、服务、启动组件等能力glide.with(context).load(url).into(imageview)camerax 相比 camera2 提供更简单的相机 apinavcontroller 封装 fragment 事务和回退栈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)
}
}
context 是 android 应用访问系统能力的重要外观,调用方无需知道资源管理器、包管理器、服务管理器的内部细节。camerax 把 camera2 中复杂的设备枚举、session、capturerequest 封装成更容易使用的用例 api。navcontroller 把导航图、参数、fragment 切换、返回栈管理封装成统一入口。activity.oncreate()、onstart()、onresume()fragment 生命周期view.draw() 中的测量、绘制、子 view 绘制流程baseadapter.getview()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")
}
}
view.draw() 内部大致按背景、内容、子 view、前景等步骤绘制,子类可重写 ondraw() 填充自定义绘制。if else。recyclerview.layoutmanagerrecyclerview.itemanimatordiffutil.itemcallbackinterpolatorinterface 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))
}
}
recyclerview 通过替换 linearlayoutmanager、gridlayoutmanager、staggeredgridlayoutmanager 改变布局策略。interpolator 决定动画数值随时间变化的策略,例如线性、加速、减速。diffutil.itemcallback 把“如何判断两个 item 是否相同”的策略交给业务层。activity -> window -> decorview -> viewgroup -> viewviewgroup.dispatchtouchevent()、onintercepttouchevent()、ontouchevent()okhttp interceptor 拦截器链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
}
activity.dispatchtouchevent(),再进入 window 和根 view。viewgroup 可以通过 onintercepttouchevent() 决定是否拦截事件。ontouchevent() 继续处理。lifecycle.stateinterface 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()
}
}
lifecycleregistry 会在生命周期事件发生时推进内部状态,例如 initialized、created、started、resumed。runnable 投递到 handlerpendingintentview.onclicklistenerworkrequestinterface 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()
}
}
handler.post(runnable) 把一段逻辑封装为 runnable,放入消息队列等待主线程或工作线程执行。pendingintent 把未来要执行的启动 activity、service、broadcast 操作交给系统保存并触发。workrequest 把后台任务的执行条件、输入数据、调度要求封装起来,由 workmanager 统一执行。activity 同时承担 controller 和部分 view 职责。activity/fragment 作为 view,presenter 处理业务逻辑。viewmodel 暴露状态,activity/fragment/compose 负责渲染。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)
}
}
}
}
viewmodel 生命周期长于配置变化后的 activity/fragment 重建,适合保存 ui 状态。livedata / stateflow 让 view 观察状态变化,体现观察者模式。state -> ui 思路也是 mvvm / 单向数据流思想的延伸。view 和 viewgroupmenu / menuitemabstract 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() }
}
}
viewgroup 继承自 view,因此容器本身也是一个 view。viewgroup 内部持有子 view 列表,测量、布局、绘制时会递归处理子节点。bitmap 缓存recyclerview 复用 viewholderdrawable、colorstatelist 等资源数据class bitmappool {
private val cache = mutablemapof<string, bitmap>()
fun get(key: string, loader: () -> bitmap): bitmap {
return cache[key] ?: loader().also { bitmap ->
cache[key] = bitmap
}
}
}
recyclerview 通过回收池复用 viewholder,避免列表滑动时频繁创建 view。| 你在做什么 | 常见模式 |
|---|---|
| 创建复杂对象 | builder |
| 控制对象唯一 | singleton |
| 把创建权交出去 | factory |
| 数据变了通知 ui | observer |
| 数据接到列表控件 | adapter |
| 跨进程像本地调用 | proxy |
| 包一层增强功能 | decorator |
| 给复杂系统一个简单入口 | facade |
| 框架定流程,业务填步骤 | template method |
| 替换算法或行为 | strategy |
| 请求一路传递 | chain of responsibility |
| 不同状态不同行为 | state |
| 操作排队或延迟执行 | command |
| 树形 ui 统一处理 | composite |
| 大量对象共享复用 | flyweight |
到此这篇关于android常用设计模式速查一览表的文章就介绍到这了,更多相关android常用设计模式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论