当前位置: 首页 > 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.lryc.cn/news/609707.html

相关文章:

  • 【优选算法】分治--归并排序
  • HTTP各个版本对比
  • 【核心技术二】Uvicorn:高性能 ASGI 服务器
  • AI开发框架与工具:构建智能应用的技术基石
  • 使用vue缓存机制 缓存整个项目的时候 静态的一些操作也变的很卡,解决办法~超快超简单~
  • FrePrompter: Frequency self-prompt for all-in-one image restoration
  • RAG中的评估指标总结:BLEU、ROUGE、 MRR、MAP、nDCG、Precision@k、Recall@k 等
  • Linux 安装与配置 MySQL 教程
  • 牛客网之华为机试题:HJ26 字符串排序
  • 直角坐标系里的四象限对NLP中的深层语义分析的积极影响和启示
  • debian 时间同步 设置ntp服务端 客户端
  • Petalinux驱动开发
  • Redis 常用数据结构以及单线程模型
  • Apache Camel 中 ProducerTemplate
  • 哪些第三方 Crate 可以直接用?
  • 深入解析 Apache Tomcat 配置文件
  • RK Android14 新建分区恢复出厂设置分区数据不擦除及开机动画自定义(一)
  • PHP-分支语句、while循环、for循环
  • Android 分析底电流高即功耗大的几个方面
  • 开疆智能ModbusTCP转Profient网关连接ER机器人配置案例
  • LeetCode 140:单词拆分 II
  • 机械设备制造企业:大型设备采购流程与注意事项
  • 百度翻译详解:包括PaddleNLP、百度AI开放平台、接口逆向(包括完整代码)
  • 晨控CK-GW08S与汇川AC系列PLC配置Ethernet/IP通讯连接手册
  • 【学习笔记】Manipulate-Anything(基于视觉-语言模型的机器人自动化操控系统)
  • Spark SQL:用SQL玩转大数据
  • ROS2机器人编程新书推荐-2025-精通ROS 2机器人编程:使用ROS 2进行复杂机器人的设计、构建、仿真与原型开发(第四版)
  • 力扣热题100——滑动窗口
  • Axure日期日历高保真动态交互原型
  • MySQL 约束知识体系:八大约束类型详细讲解