Kotlin教程笔记(53) - 改良设计模式 - 策略模式

简介: 本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。

本系列学习教程笔记属于详细讲解Kotlin语法的教程,需要快速学习Kotlin语法的小伙伴可以查看“简洁” 系列的教程

快速入门请阅读如下简洁教程:
Kotlin学习教程(一)
Kotlin学习教程(二)
Kotlin学习教程(三)
Kotlin学习教程(四)
Kotlin学习教程(五)
Kotlin学习教程(六)
Kotlin学习教程(七)
Kotlin学习教程(八)
Kotlin学习教程(九)
Kotlin学习教程(十)

Kotlin教程笔记(53) - 改良设计模式 - 策略模式

imgKotlin - 改良设计模式 - 策略模式
欢迎关注微信公众号:[FSA全栈行动 👋]

一、前言

策略模式
作用:让算法的变化独立于使用算法的客户
核心操作:定义了算法族,分别封装起来,让它们之间可以相互替换

二、使用策略模式

例子:游泳运动员的游泳姿势
重点:算法抽离,封装成策略
作为一个游泳运动员,最基本的技能就是游泳,所以该类可以这么定义:

/**

  • 游泳运动员
    *
  • @author GitLqr
    */
    class Swimmer {
    fun swim() {
     println("游泳中...")
    
    }
    }

// 使用
val shaw = Swimmer()
shaw.swim() // 游泳中...
但是,游泳体育项目会对游泳姿势进行细分(姑且称之为技能吧),比如:蛙泳、仰泳、自由泳等等,那怎么让 Swimmer 可以使用这些技能呢?一种做法是直接给 Swimmer 添加这些技能对应的方法,比如:

// ========== 错误演示 ==========
class Swimmer {
fun breaststroke() {
print("蛙泳...")
}

fun backstroke() {
    print("仰泳...")
}

fun freestyle() {
    print("自由泳...")
}

}
可以很明确的说,这种做法是不行的,因为违背了开闭原则,后续被纳入标准的游泳姿势可能会越来越多,比如:狗刨,继续往 Swimmer 增加新方法吗?肯定不行,这时策略模式就派上用场了,站在程序角度看,游泳姿势也不过是一种算法,可以把这几种游泳姿势(算法)分别封装起来,为了能让算法相互替换,需要定义一个算法接口:

/**

  • 游泳姿势接口
    *
  • @author GitLqr
    */
    interface SwimStrategy {
    fun swim()
    }

/**

  • 各种游泳姿势的具体实现
    *
  • @author GitLqr
    */
    class Breaststroke : SwimStrategy {
    override fun swim() {
     print("蛙泳...")
    
    }
    }

class Backstroke : SwimStrategy {
override fun swim() {
print("仰泳...")
}
}

class Freestyle : SwimStrategy {
override fun swim() {
print("自由泳...")
}
}
接着,再通过构造器,把算法交给 Swimmer 使用即可:

/**

  • 游泳运动员(策略模式)
    *
  • @author GitLqr
    */
    class Swimmer(val strategy: SwimStrategy) {
    fun swim() {
     strategy.swim()
    
    }
    }

// 使用
val freestyleSwimmer = Swimmer(Freestyle())
freestyleSwimmer.swim()
val breaststrokeSwimmer = Swimmer(Breaststroke())
breaststrokeSwimmer.swim()
以后有更多的游泳姿势,只需要扩展 SwimStrategy 的实现类即可,无需修改 Swimmer。

三、改良策略模式

例子:游泳运动员的游泳姿势
重点:高阶函数
高阶函数是参数或返回值是函数的函数,由于策略模式是对行为算法的一种抽象,上述例子的本质是让 Swimmer 对象执行外界传入的 算法函数 而已,那么借助高阶函数的特性,我们可以让 算法函数 作为高阶函数的参数传入即可,而不需要单独定义接口,所以在 Kotlin 中可以使用高阶函数来改良策略模式:

fun breaststroke() {
print("蛙泳...")
}

fun backstroke() {
print("仰泳...")
}

fun freestyle() {
print("自由泳...")
}

/**

  • 游泳运动员(策略模式)改良:高阶函数
    *
  • @author GitLqr
    */
    class Swimmer(val strategy: () -> Unit) {
    fun swim() {
     strategy()
    
    }
    }

// 使用
val freestyleSwimmer = Swimmer(::freestyle) // 传入方法引用
freestyleSwimmer.swim()
val breaststrokeSwimmer = Swimmer(::breaststroke)
breaststrokeSwimmer.swim()
改造之后,不但减少了代码量(去掉了策略算法接口),也使代码结构更加直观。

相关文章
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
382 35
|
2月前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
301 1
|
3月前
|
设计模式 人工智能 算法
基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
接下来,我会结合实战案例,聊聊如何用「策略模式 + 责任链模式」构建灵活可扩展的状态引擎,让抽奖系统的状态管理从「混乱战场」变成「有序流水线」。
|
7月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
7月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
144 14
|
10月前
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
344 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
12月前
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
154 2
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
173 2
|
7月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
224 16