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

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

策略模式:一种行为型模式,这些设计模式特别关注对象之间的通信。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

介绍
  • 意图:定义一系列的算法、策略或行为,把它们封装成一个一个的策略类,
  • 主要解决问题:在有多种相似算法、策略或行为的情况下,使用 if...else 所带来的复杂和难以维护
  • 关键代码:实现同一个接口
  • 优点:1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
  • 缺点:1、策略类会增多。 2、所有策略类都需要对外暴露(这有点违背设计模式六大原则的迪米特法则)。

举个例子:绘制三角形、圆形、矩形图案(Android Kotlin 自定义View)

步骤1:创建一个接口

interface Strategy {fun runCanvas(canvas: Canvas?)
}

步骤2:创建实现接口的实体类。

class Triangle:Strategy {override fun runCanvas(canvas: Canvas?) {// 绘制一个三角形行为// ......}
}
class Circular:Strategy {override fun runCanvas(canvas: Canvas?) {// 绘制一个圆形行为// ......}
}
class Rectangle:Strategy {override fun runCanvas(canvas: Canvas?) {// 绘制一个矩形形行为// ......}
}

步骤3:创建上下文类。

//创建 Context 类。
//class Context(private val strategy: Strategy) {
//    
//    fun executeStrategy(canvas: Canvas?){
//        return strategy.runCanvas(canvas)
//    }
//}class CustomView(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : View(context, attrs, defStyleAttr, defStyleRes) {constructor(context: Context) : this(context, null, 0)constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs, defStyleAttr,0)private var strategy: Strategy? = nullfun setStrategy(strategy: Strategy?) {this.strategy = strategy}override fun onDraw(canvas: Canvas?) {strategy?.runCanvas(canvas)super.onDraw(canvas)}}

步骤:使用

//        使用 Context 来查看当它改变策略 Strategy 时的行为变化。
//        var context = Context(Triangle())
//        context.executeStrategy(canvas)
//        var context = Context(Circular())
//        context.executeStrategy(canvas)
//        var context = Context(Rectangle())
//        context.executeStrategy(canvas)//      改变策略 StrategycustomView.setStrategy(Triangle())customView.invalidate()//触发执行draw方法customView.setStrategy(Circular())customView.invalidate()customView.setStrategy(Rectangle())customView.invalidate()

http://www.lryc.cn/news/225551.html

相关文章:

  • Spring Boot 集成 ElasticSearch
  • 百度智能云正式上线Python SDK版本并全面开源!
  • LeetCode(3)删除有序数组中的重复项【数组/字符串】【简单】
  • 前端视角中的微信登录
  • Python 中使用 Selenium 隐式等待
  • GEE:基于 Landsat 计算的 kNDVI 应用 APP
  • Spring 缓存注解
  • 微信小程序前端开发
  • C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割
  • 无需开发,精臣云可轻松连接用户运营、广告推广等行业应用
  • 第三阶段第一章——PySpark实战
  • Python数据容器(字符串)
  • Python---练习:把8名讲师随机分配到3个教室
  • python+requests接口自动化测试
  • 【T3】畅捷通T3采购管理模块反结账,提示:本年数据已经结转,不能取消结账。
  • 线性代数(五) | 矩阵对角化 特征值 特征向量
  • 读书笔记:彼得·德鲁克《认识管理》第12章 服务机构的绩效管理
  • 基于FPGA的模板匹配红外目标跟踪算法设计
  • ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR
  • 用于强化学习的置换不变神经网络
  • 【华为OD题库-008】座位调整-Java
  • 4 Paimon数据湖之Hive Catalog的使用
  • Verilog刷题[hdlbits] :Bcdadd100
  • Flink—— Data Source 介绍
  • 树之二叉排序树(二叉搜索树)
  • 管易云与电商平台的无代码集成:实现API连接与用户运营
  • ElementUI的el-upload上传组件与表单一起提交遇到的各种问题以及解决办法(超详细,每个步骤都有详细解读)
  • python flask_restful “message“: “Failed to decode JSON object: None“
  • Linux内核有什么之内存管理子系统有什么第六回 —— 小内存分配(4)
  • 【OpenHarmony内核】Harmony内核之线程操作函数(二)