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

设计模式 -> 策略模式(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.xdnf.cn/news/17099.html

相关文章:

  • 经典设计模式
  • 验证码等待时间技术在酒店自助入住、美容自助与社区场景中的应用必要性研究—仙盟创梦IDE
  • Calcite自定义扩展SQL案例详细流程篇
  • 六、Linux核心服务与包管理
  • 前端 拼多多4399笔试题目
  • [自动化Adapt] 录制引擎 | iframe 穿透 | NTP | AIOSQLite | 数据分片
  • Connection refused: no further information: localhost/127.0.0.1:2375
  • 第四章:OSPF 协议
  • ssh服务器端口和本地端口映射
  • [spring-cloud: 服务发现]-源码解析
  • 旧笔记本电脑如何安装飞牛OS
  • 电商系统定制开发流程:ZKmall开源商城需求分析到上线全程可控
  • MySQL深度理解-MySQL锁机制
  • 【Mysql】日志--错误日志、二进制日志、查询日志、慢查询日志
  • Shell脚本-变量的定义规则
  • LLM调研
  • 【QT】概述
  • Azure DevOps — Kubernetes 上的自托管代理 — 第 4 部分
  • 微分方程模型:用“变化率”的语言,描绘世间万物的动态演化
  • 前端面试手撕题目全解析
  • 2、docker容器命令 | 信息查看
  • io_submit系统调用及示例
  • 01.Redis 概述
  • AI Agent 重塑产业发展新格局
  • ICT模拟零件测试方法--电位器测试
  • Linux 文件与目录操作命令宝典
  • Kali基础知识点【1】
  • std::unordered_map 和 std::map的区别【C++】
  • 【开发备忘】下载并本地部署天地图WMTS服务
  • 文本换行问题