当前位置: 首页 > news >正文

设计模式 -> 策略模式(Strategy Pattern)

前言

Android开发中,策略模式是一种常用的设计模式,它能够让我们在运行时动态选择算法或行为。本文将重点介绍如何在Android中安全地实现策略模式,避免内存泄漏问题。

传统策略模式的问题

// ❌ 存在内存泄漏风险的实现
object LazyStart : StartStrategy {override operator fun invoke(block: suspend () -> Unit) {GlobalScope.launch {delay(1000)  // 延迟执行可能导致内存泄漏,block表达式持有的Activity/Fragment可能销毁后再执行,导致Activity/Fragment无法被GCblock()}}
}// 危险使用场景
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)LazyStart {updateUI()  // Activity可能已销毁,但lambda仍被执行}}
}

✅ 内存安全的解决方案

方案1:Class实现 + 作用域绑定

class SafeImmediateStart(private val scope: CoroutineScope) : StartStrategy {override operator fun invoke(block: suspend () -> Unit) {scope.launch {block()}}
}class SafeLazyStart(private val scope: CoroutineScope) : StartStrategy {override operator fun invoke(block: suspend () -> Unit) {scope.launch {delay(1000)block()}}
}// 安全使用
class MainActivity : AppCompatActivity() {private val immediateStrategy = SafeImmediateStart(lifecycleScope)private val lazyStrategy = SafeLazyStart(lifecycleScope)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)immediateStrategy {updateUI()  // 安全:Activity销毁时协程自动取消}}
}

方案2:枚举实现 + 作用域绑定

enum class SafeStartStrategy {IMMEDIATE {override fun execute(scope: CoroutineScope, block: suspend () -> Unit) {scope.launch { block() }}},LAZY {override fun execute(scope: CoroutineScope, block: suspend () -> Unit) {scope.launch {delay(1000)block()}}};abstract fun execute(scope: CoroutineScope, block: suspend () -> Unit)operator fun invoke(scope: CoroutineScope, block: suspend () -> Unit) {execute(scope, block)}
}// 使用方式
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)SafeStartStrategy.LAZY(lifecycleScope) {updateUI()}}
}

实际应用场景

// 内存安全检查清单
class MemorySafeStrategy(private val scope: CoroutineScope  // ✅ 1. 绑定正确作用域
) : StartStrategy {override operator fun invoke(block: suspend () -> Unit) {scope.launch {  // ✅ 2. 使用传入的scopetry {block()} catch (e: CancellationException) {// ✅ 3. 处理取消异常Log.d("Strategy", "Execution cancelled")}}}
}

核心总结

场景推荐方案原因
UI操作Class + lifecycleScope绑定Activity生命周期
数据处理Class + viewModelScope绑定ViewModel生命周期
简单工具改进枚举 + scope参数简洁且安全
http://www.dtcms.com/a/314352.html

相关文章:

  • 2025年8月4日私鱼创作平台v1.0.4公测版更新发布-完成大部分功能包含关注创作者以及发布作品及合集功能优雅草科技
  • 06 基于sklearn的机械学习-欠拟合、过拟合、正则化、逻辑回归
  • 线程互斥锁:守护临界区的关键
  • 可编辑190页PPT | 某科技集团数字化转型SAP解决方案
  • Vue 3 版本的 JWT 单点登录 (SSO) 实现
  • 国家科学技术奖答辩PPT案例_科技进步奖ppt制作_技术发明奖ppt设计美化_自然科学奖ppt模板 | WordinPPT
  • 使用mybatis生成器生成实体类mapper和查询参数文件,实现简单增删改查。使用log4j输出日志到控制台。使用配置文件注册Bean,配置视图解析器
  • 【Java】使用模板方法模式设计EasyExcel批量导入导出
  • Apache Camel 中 ProducerTemplate
  • 刷题日志(7)——二叉树高频习题(下)
  • 高精度实战:YOLOv11交叉口目标行为全透视——轨迹追踪×热力图×滞留分析(附完整代码)
  • FrePrompter: Frequency self-prompt for all-in-one image restoration
  • Opencv[一]
  • R 语言科研绘图第 67 期 --- 箱线图-显著性
  • Spark SQL:用SQL玩转大数据
  • OpenCV轻松入门_面向python(第二章图像处理基础)
  • 论文阅读笔记:《Dataset Distillation by Matching Training Trajectories》
  • 【数据结构初阶】--算法复杂度详解
  • 登录弹窗,cv直接使用
  • 【FreeRTOS】系统时钟配置
  • HTTP基本结构
  • ICCV 2025|单视频生成动态4D场景!中科大微软突破4D生成瓶颈,动画效果炸裂来袭!
  • ICCV 2025|可灵团队新作 ReCamMaster:从单视频到多视角生成,多角度看好莱坞大片
  • socket与udp
  • 折叠屏网页布局挑战:响应式设计在工业平板与PC端的弹性适配策略
  • 【Mac】OrbStack:桌面端虚拟机配置与使用
  • LeetCode 140:单词拆分 II
  • 【MySQL03】:MySQL约束
  • mac 技巧
  • 零售消费行业研究系列报告