资讯动态

Android 常用设计模式速查

发布时间:2026/9/8 17:38:17 来源:尧图企业网站定制
本文整理 Android 开发中常见技术点对应的设计模式并给出简化伪代码、典型源码/原理使用位置。伪代码用于理解模式结构不等同于源码实现。总览设计模式Android 常见技术点典型使用位置单例模式全局管理器、系统服务、数据库实例WorkManager.getInstance()、Room.databaseBuilder()后的数据库单例、SystemServiceRegistryBuilder 模式复杂对象构建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、播放器状态、登录状态命令模式把操作封装为对象RunnableHandler、PendingIntent、点击事件回调MVC / MVP / MVVM应用架构分层Activity/Fragment、ViewModel、LiveData/StateFlow、Repository1. 单例模式 Singleton使用场景应用内只有一个实例数据库、配置中心、线程池、日志工具。Android 系统服务通过统一入口获取共享服务。避免重复创建重资源对象。Android 中的例子WorkManager.getInstance(context)RoomDatabase通常在应用层做单例封装SystemServiceRegistry管理系统服务实例Application全局生命周期入口伪代码classAppDatabaseprivateconstructor(){companionobject{Volatileprivatevarinstance:AppDatabase?nullfungetInstance():AppDatabase{returninstance?:synchronized(this){instance?:AppDatabase().also{instanceit}}}}}源码 / 原理标注Context.getSystemService()背后会从系统服务注册表中按名称获取服务。WorkManager通过getInstance()对外提供统一入口内部保证调度组件可被全局访问。Room 数据库实例创建成本较高官方实践通常建议在应用进程内复用单例。2. Builder 模式使用场景对象参数很多构造函数会变得臃肿。创建过程需要链式配置。最终通过build()或create()生成目标对象。Android 中的例子AlertDialog.BuilderNotificationCompat.BuilderRoom.databaseBuilder(context, AppDatabase::class.java, db).build()WorkRequest.Builder伪代码classDialogprivateconstructor(valtitle:String?,valmessage:String?,valcancelable:Boolean){classBuilder{privatevartitle:String?nullprivatevarmessage:String?nullprivatevarcancelable:BooleantruefunsetTitle(value:String)apply{titlevalue}funsetMessage(value:String)apply{messagevalue}funsetCancelable(value:Boolean)apply{cancelablevalue}funbuild():Dialog{returnDialog(title,message,cancelable)}}}源码 / 原理标注AlertDialog.Builder先收集标题、按钮、布局等配置最后调用create()构建AlertDialog。NotificationCompat.Builder把通知图标、标题、内容、渠道等复杂参数集中封装降低构造复杂度。Room 的 builder 会配置数据库名、迁移策略、线程策略最后创建数据库实例。3. 工厂模式 Factory使用场景调用方不直接依赖具体类构造函数。根据条件创建不同对象。框架希望把对象创建权开放给开发者定制。Android 中的例子LayoutInflater.Factory2创建 ViewFragmentFactory创建 FragmentViewModelProvider.Factory创建 ViewModelServiceLoader或依赖注入框架中的对象创建伪代码interfaceViewModelFactory{funT:ViewModelcreate(modelClass:ClassT):T}classUserViewModelFactory(privatevalrepository:UserRepository):ViewModelFactory{overridefunT:ViewModelcreate(modelClass:ClassT):T{if(modelClassUserViewModel::class.java){returnUserViewModel(repository)asT}error(Unknown ViewModel)}}源码 / 原理标注ViewModelProvider不知道业务ViewModel如何构造于是通过Factory把创建过程交给调用方。LayoutInflater解析 XML 时需要把标签名转换成具体View对象这就是典型的创建型模式场景。FragmentFactory允许 Fragment 使用带参数构造或依赖注入方式创建避免框架只能调用空构造。4. 观察者模式 Observer使用场景一个对象状态变化需要通知多个观察者。UI 自动响应数据变化。生命周期变化需要通知监听者。Android 中的例子LiveData.observe(owner, observer)Lifecycle.addObserver(observer)StateFlow/SharedFlowTextWatcher、BroadcastReceiver伪代码classObservableDataT{privatevalobserversmutableListOf(T)-Unit()privatevarvalue:T?nullfunobserve(observer:(T)-Unit){observersobserver value?.let(observer)}funsetValue(newValue:T){valuenewValue observers.forEach{it(newValue)}}}源码 / 原理标注LiveData保存观察者列表数据变化后分发给活跃生命周期状态下的观察者。LifecycleRegistry内部维护观察者并在Activity/Fragment生命周期变化时派发生命周期事件。BroadcastReceiver可以理解为系统级发布订阅机制发送广播后匹配的接收者会收到通知。5. 适配器模式 Adapter使用场景将一种接口转换成另一种接口。数据结构和 UI 展示组件不直接耦合。让已有数据适配目标控件协议。Android 中的例子RecyclerView.AdapterListAdapterCursorAdapterPagerAdapter伪代码classUserAdapter(privatevalusers:ListUser):RecyclerView.AdapterUserViewHolder(){overridefungetItemCount():Int{returnusers.size}overridefunonCreateViewHolder(parent:ViewGroup,viewType:Int):UserViewHolder{returnUserViewHolder(parent.inflate(item_user))}overridefunonBindViewHolder(holder:UserViewHolder,position:Int){holder.bind(users[position])}}源码 / 原理标注RecyclerView不关心数据来源只依赖Adapter提供数量、创建 ViewHolder、绑定数据。CursorAdapter把数据库查询结果Cursor适配成列表项视图。ListAdapter在适配器基础上加入DiffUtil让列表更新更高效。6. 代理模式 Proxy使用场景调用方访问的是代理对象代理对象再转发给真实对象。可以隐藏跨进程、远程、权限校验、缓存等复杂细节。Android IPC 是代理模式的经典场景。Android 中的例子Binder IPC 中的Stub和ProxyAIDL 自动生成代码系统服务接口例如ActivityManager、PackageManager伪代码interfaceIUserService{fungetUserName(id:Long):String}classUserServiceProxy(privatevalremoteBinder:Binder):IUserService{overridefungetUserName(id:Long):String{valdataParcel.obtain()valreplyParcel.obtain()data.writeLong(id)remoteBinder.transact(CODE_GET_USER,data,reply,0)returnreply.readString()}}源码 / 原理标注AIDL 会生成Stub和Proxy本地进程调用接口方法实际由Proxy封装参数并通过 Binder 发送到远端。客户端拿到的很多系统服务接口并不是真实服务对象而是 Binder 代理。Proxy屏蔽了进程边界让跨进程调用看起来像普通方法调用。7. 装饰器模式 Decorator使用场景不修改原类的情况下增强对象能力。多层包装逐步叠加功能。保持原始接口一致。Android 中的例子ContextWrapperContextThemeWrapperJava IO 中的BufferedInputStream(InputStream)AppCompat 中对Context和View的包装增强伪代码openclassBaseContext{openfungetThemeName():StringDefault}openclassContextWrapper(privatevalbase:BaseContext):BaseContext(){overridefungetThemeName():String{returnbase.getThemeName()}}classThemeContextWrapper(base:BaseContext,privatevaltheme:String):ContextWrapper(base){overridefungetThemeName():String{returntheme}}源码 / 原理标注ContextWrapper内部持有一个base Context默认把大部分调用委托给它。ContextThemeWrapper在原有Context基础上叠加主题能力。Activity本身也继承自ContextThemeWrapper因此具备上下文和主题相关能力。8. 外观模式 Facade使用场景对外暴露简单接口内部封装复杂子系统。降低调用方理解成本。常用于 SDK、框架入口、工具库入口。Android 中的例子Context封装资源、文件、服务、启动组件等能力Glide.with(context).load(url).into(imageView)CameraX相比 Camera2 提供更简单的相机 APINavController封装 Fragment 事务和回退栈伪代码classImageLoaderFacade(privatevalcache:ImageCache,privatevalnetwork:ImageNetwork,privatevaldecoder:ImageDecoder){funload(url:String,imageView:ImageView){valbytescache.get(url)?:network.download(url)valbitmapdecoder.decode(bytes)imageView.setImageBitmap(bitmap)}}源码 / 原理标注Context是 Android 应用访问系统能力的重要外观调用方无需知道资源管理器、包管理器、服务管理器的内部细节。CameraX把 Camera2 中复杂的设备枚举、Session、CaptureRequest 封装成更容易使用的用例 API。NavController把导航图、参数、Fragment 切换、返回栈管理封装成统一入口。9. 模板方法模式 Template Method使用场景父类定义算法骨架。子类只重写流程中的部分步骤。框架控制整体流程业务代码填充细节。Android 中的例子Activity.onCreate()、onStart()、onResume()Fragment生命周期View.draw()中的测量、绘制、子 View 绘制流程BaseAdapter.getView()伪代码abstractclassBaseActivity{funperformCreate(){attachBaseContext()onCreate()restoreState()}protectedopenfunattachBaseContext(){}protectedabstractfunonCreate()protectedopenfunrestoreState(){}}classMainActivity:BaseActivity(){overridefunonCreate(){setContentView(activity_main)}}源码 / 原理标注Android Framework 决定生命周期调用顺序开发者只重写指定回调。View.draw()内部大致按背景、内容、子 View、前景等步骤绘制子类可重写onDraw()填充自定义绘制。模板方法体现了“框架调用业务代码”的控制反转思想。10. 策略模式 Strategy使用场景同一个上下文中切换不同算法或行为。行为对象可以独立替换。减少大量if else。Android 中的例子RecyclerView.LayoutManagerRecyclerView.ItemAnimatorDiffUtil.ItemCallback动画插值器Interpolator伪代码interfaceSortStrategy{funsort(items:ListItem):ListItem}classTimeSortStrategy:SortStrategy{overridefunsort(items:ListItem)items.sortedBy{it.time}}classNameSortStrategy:SortStrategy{overridefunsort(items:ListItem)items.sortedBy{it.name}}classItemController(privatevarstrategy:SortStrategy){funrender(items:ListItem){show(strategy.sort(items))}}源码 / 原理标注RecyclerView通过替换LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager改变布局策略。Interpolator决定动画数值随时间变化的策略例如线性、加速、减速。DiffUtil.ItemCallback把“如何判断两个 item 是否相同”的策略交给业务层。11. 责任链模式 Chain of Responsibility使用场景请求沿着一条链传递。链上每个节点都有机会处理或继续传递。常用于事件分发、请求拦截、日志处理。Android 中的例子触摸事件分发Activity-Window-DecorView-ViewGroup-ViewViewGroup.dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()OkHttp Interceptor拦截器链伪代码abstractclassEventNode{varnext:EventNode?nullfundispatch(event:MotionEvent):Boolean{if(handle(event)){returntrue}returnnext?.dispatch(event)?:false}protectedabstractfunhandle(event:MotionEvent):Boolean}源码 / 原理标注触摸事件先到Activity.dispatchTouchEvent()再进入Window和根 View。ViewGroup可以通过onInterceptTouchEvent()决定是否拦截事件。如果子 View 不消费事件事件可能回到父容器或自身的onTouchEvent()继续处理。OkHttp 的应用拦截器、重试拦截器、缓存拦截器、网络拦截器按链式顺序处理请求。12. 状态模式 State使用场景对象在不同状态下行为不同。状态转换规则比较清晰。避免状态相关逻辑散落在多个条件分支中。Android 中的例子Lifecycle.State播放器状态Idle、Preparing、Playing、Paused、Completed登录状态Guest、LoggedIn、Expired下载任务状态Pending、Running、Success、Failed伪代码interfacePlayerState{funplay(player:Player)funpause(player:Player)}classIdleState:PlayerState{overridefunplay(player:Player){player.prepare()player.statePlayingState()}overridefunpause(player:Player){// Idle 状态下无需处理}}classPlayingState:PlayerState{overridefunplay(player:Player){}overridefunpause(player:Player){player.pauseInternal()player.statePausedState()}}源码 / 原理标注LifecycleRegistry会在生命周期事件发生时推进内部状态例如INITIALIZED、CREATED、STARTED、RESUMED。UI 层常用状态驱动渲染例如 Loading、Content、Empty、Error。播放器、下载器、上传器这类组件很适合用状态模式管理行为。13. 命令模式 Command使用场景把一个操作封装成对象。操作可以延迟执行、排队执行、撤销或重试。调用者和执行者解耦。Android 中的例子Runnable投递到HandlerPendingIntentView.OnClickListenerWorkRequest伪代码interfaceCommand{funexecute()}classSaveUserCommand(privatevalrepository:UserRepository,privatevaluser:User):Command{overridefunexecute(){repository.save(user)}}classCommandQueue{privatevalcommandsArrayDequeCommand()funenqueue(command:Command){commands.addLast(command)}funrunNext(){commands.removeFirstOrNull()?.execute()}}源码 / 原理标注Handler.post(Runnable)把一段逻辑封装为Runnable放入消息队列等待主线程或工作线程执行。PendingIntent把未来要执行的启动 Activity、Service、Broadcast 操作交给系统保存并触发。WorkRequest把后台任务的执行条件、输入数据、调度要求封装起来由 WorkManager 统一执行。14. MVC / MVP / MVVM 架构模式使用场景组织应用层代码职责。降低 UI、业务逻辑、数据源之间的耦合。提高可测试性和可维护性。Android 中的例子MVC早期Activity同时承担 Controller 和部分 View 职责。MVPActivity/Fragment作为 ViewPresenter 处理业务逻辑。MVVMViewModel暴露状态Activity/Fragment/Compose负责渲染。Repository隔离网络、数据库、缓存等数据来源。伪代码classUserViewModel(privatevalrepository:UserRepository):ViewModel(){privateval_uiStateMutableStateFlowUserUiState(UserUiState.Loading)valuiState:StateFlowUserUiState_uiStatefunloadUser(id:Long){viewModelScope.launch{_uiState.valueUserUiState.Loading _uiState.valuerunCatching{repository.getUser(id)}.fold(onSuccess{UserUiState.Content(it)},onFailure{UserUiState.Error(it.message.orEmpty())})}}}classUserFragment:Fragment(){privatevalviewModel:UserViewModelbyviewModels()funrender(){collect(viewModel.uiState){state-when(state){isUserUiState.Loading-showLoading()isUserUiState.Content-showUser(state.user)isUserUiState.Error-showError(state.message)}}}}源码 / 原理标注ViewModel生命周期长于配置变化后的Activity/Fragment重建适合保存 UI 状态。LiveData/StateFlow让 View 观察状态变化体现观察者模式。Repository 隔离数据来源让 UI 层不直接依赖 Retrofit、Room、DataStore 等具体实现。Jetpack Compose 中常见的State - UI思路也是 MVVM / 单向数据流思想的延伸。15. 组合模式 Composite使用场景树形结构中单个对象和组合对象使用统一接口。调用方可以一致地处理叶子节点和容器节点。Android 中的例子View和ViewGroup菜单结构Menu/MenuItemCompose UI 树伪代码abstractclassUiNode{abstractfundraw()}classTextNode:UiNode(){overridefundraw(){drawText()}}classContainerNode:UiNode(){privatevalchildrenmutableListOfUiNode()funadd(child:UiNode){childrenchild}overridefundraw(){children.forEach{it.draw()}}}源码 / 原理标注ViewGroup继承自View因此容器本身也是一个 View。ViewGroup内部持有子 View 列表测量、布局、绘制时会递归处理子节点。Compose 运行时维护 UI 组合树状态变化后按树结构进行重组和更新。16. 享元模式 Flyweight使用场景大量相似对象共享内部状态减少内存开销。缓存可复用对象。图片、字符串、资源对象等都可能用到共享思想。Android 中的例子Bitmap缓存RecyclerView复用ViewHolder资源系统复用Drawable、ColorStateList等资源数据字符串常量池伪代码classBitmapPool{privatevalcachemutableMapOfString,Bitmap()funget(key:String,loader:()-Bitmap):Bitmap{returncache[key]?:loader().also{bitmap-cache[key]bitmap}}}源码 / 原理标注RecyclerView通过回收池复用 ViewHolder避免列表滑动时频繁创建 View。图片加载库通常使用内存缓存、磁盘缓存、Bitmap 池降低内存抖动。Android 资源加载系统会缓存部分资源避免重复解析和创建。记忆方式你在做什么常见模式创建复杂对象Builder控制对象唯一Singleton把创建权交出去Factory数据变了通知 UIObserver数据接到列表控件Adapter跨进程像本地调用Proxy包一层增强功能Decorator给复杂系统一个简单入口Facade框架定流程业务填步骤Template Method替换算法或行为Strategy请求一路传递Chain of Responsibility不同状态不同行为State操作排队或延迟执行Command树形 UI 统一处理Composite大量对象共享复用Flyweight学习建议看源码时先问这个类是在创建对象、转发调用、分发事件、保存状态还是适配数据Android Framework 很多模式不是“标准教科书写法”而是为了生命周期、IPC、UI 树、线程模型做了工程化变体。面试回答时建议按“三段式”先说模式定义再说 Android 例子最后说源码或原理中的关键调用链。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价