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

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

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

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

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

imgKotlin - 改良设计模式 - 策略模式

#一、前言

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

#二、使用策略模式

  • 例子:游泳运动员的游泳姿势
  • 重点:算法抽离,封装成策略

作为一个游泳运动员,最基本的技能就是游泳,所以该类可以这么定义:

/**
 * 游泳运动员
 *
 * @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()

改造之后,不但减少了代码量(去掉了策略算法接口),也使代码结构更加直观。

相关文章
|
1天前
|
JavaScript Java Kotlin
|
1天前
|
IDE 开发工具 iOS开发
Kotlin教程笔记(11) - 面向对象之抽象类与接口
本系列教程笔记详细讲解了Kotlin语法,适合深入学习。若需快速掌握Kotlin,建议查阅“简洁”系列教程。本文重点介绍了Kotlin中的抽象类与接口,包括接口的定义、实现、继承,以及抽象类的定义、构造器、方法实现等关键概念。
10 2
|
1天前
|
IDE 开发工具 开发者
Kotlin教程笔记(10) - 参数与异常
本系列教程详细讲解了Kotlin语法,适合希望深入了解Kotlin的开发者。若需快速学习,可参考“简洁”系列教程。本文档重点介绍了参数与异常处理,包括具名参数、变长参数、默认参数、多返回值及异常捕获等内容。
9 2
|
1天前
|
Java Kotlin
​ Kotlin教程笔记(15) - 方法重载与默认参数
​ Kotlin教程笔记(15) - 方法重载与默认参数
8 1
|
1天前
|
Kotlin
|
1天前
|
Java Kotlin 索引
Kotlin开发笔记- 分支与循环
Kotlin开发笔记- 分支与循环
9 0
|
29天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
8天前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
13 3
|
1月前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
1月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。