当前位置: 首页 > 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? = null

    fun 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)

//      改变策略 Strategy
        customView.setStrategy(Triangle())
        customView.invalidate()//触发执行draw方法
        customView.setStrategy(Circular())
        customView.invalidate()
        customView.setStrategy(Rectangle())
        customView.invalidate()

相关文章:

  • Zookeeper3.7.1分布式安装部署
  • Spring底层原理学习笔记--第三讲--(bean生命周期与模板方法)
  • 51单片机-串口通信
  • 求2个字符串的最短编辑距离 java 实现
  • ChatGPT和API发生重大中断!
  • 面试--springboot基础
  • 跨足泛娱乐:TikTok如何重新定义娱乐产业?
  • 有限域的Fast Multiplication和Modular Reduction算法实现
  • Flink SQL TopN语句详解
  • 【MongoDB-Redis-MySQL-Elasticsearch-Kibana-RabbitMQ-MinIO】Java全栈开发软件一网打尽
  • flutter开发实战-TweenSequence实现动画序列
  • 单通道低压 H 桥电机驱动芯片AT9110H 兼容L9110 马达驱动芯片
  • 达梦数据库答案
  • 勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?
  • SwissArmyTransformer瑞士军刀工具箱使用手册
  • 微服务之Eureka
  • 硬件知识1
  • 零代码编程:用ChatGPT批量提取flash动画swf文件中的mp3
  • React:实现一个定时器计数器,每秒自动+1
  • 大语言模型比武
  • 博物馆书单|走进博物馆,去体验一场与文明的对话
  • 上海这个咖啡文化节首次“走出去”,率本土品牌亮相英国伦敦
  • 广西北流出现强降雨,1人被洪水冲走已无生命体征
  • 辽宁援疆前指总指挥王敬华已任新疆塔城地委副书记
  • 雅典卫城上空现“巨鞋”形状无人机群,希腊下令彻查
  • 首次公布!我国空间站内发现微生物新物种