Kotlin设计模式实现之策略模式

简介: Kotlin设计模式实现之策略模式

看到题目就知道第一篇写的是策略模式了,下面来详细看看:

正文

首先来说一下需求吧:需要来模拟鸭子,有各种的鸭子,可以游泳,可以叫,有绿颜色的、还有黄颜色的等等。很简单对吧,再加上kotlin的优秀语法,就更简单了:


abstract class Ducks{
    fun quack(){
        println("呱呱呱")
    }
    fun swim(){
        println("游啊游")
    }
    abstract fun display()
}

很简单对吧,一个抽象类,里面有游泳的方法和鸭子叫的方法,还有一个显示的抽象方法,上面所说的绿鸭子和黄鸭子直接继承Ducks,然后在display中进行显示就行了:


class GreenDucks:Ducks(){
    override fun display() {
        println("我是一个绿鸭子")
    }
}
class YellowDucks:Ducks(){
    override fun display() {
        println("我是一个黄鸭子")
    }
}

但是现在来了一个新需求,需要加入飞的方法,需要让鸭子会飞。这不是小菜一碟嘛,直接在抽象类中加一个方法不得了??


fun fly(){
        println("飞飞飞")
    }

第一次优化

上面写的代码有问题,导致整个项目不合逻辑。看起来代码没有问题,咱们只在抽象类中加了一个飞的方法,但是别人继承了鸭子抽象类,写了一个橡胶鸭子,这问题就大了,你能想象一个橡皮鸭子在天上飞啊飞嘛?明显不能,现在需要补救,最简单的方法就是每个实现的子类重写一次父类的飞行方法,如果可以飞在子类中进行实现,如果不可以就不实现。

override fun fly(){
        println("我是橡皮鸭,我不会飞")
    }

第二次优化

第一次优化感觉不太好,父类代码是没动,但是每个子类都需要重写方法,两种鸭子还好说,判断相对简单,二十种、二百种呢?每一次都判断去吗?显然不太现实。那么我们可以想到另一种方法:使用接口:


可以写一个飞的接口,如果子类需要实现,就自行实现进行操作:


interface FlyBehavior {
    fun fly()
}
class GreenDucks:Ducks(),FlyBehavior{
    override fun display() {
        println("我是一个绿鸭子")
    }
    override fun fly(){
        println("我会飞")
    }
}

第三次优化

感觉还不如第一次优化呢,第一次优化只是需要不飞行的在子类中重写,但第二次优化就需要判断所有的子类是否实现接口,不行不行,还需要好好优化。


咱们可以把会改变的部分法封装起来,不变的部分不动,这样就算有改变也不怕,随时可以进行修改。


刚才已经写了一个飞行的接口,现在就来继承它:


class FlyWithNoWay: FlyBehavior {
    override fun fly() {
       println("我不会使用翅膀飞行啊,啊啊啊")
    }
}
class FlyWithWings: FlyBehavior {
    override fun fly() {
       println("使用翅膀飞行啊,啦啦啦")
    }
}

还可以把叫的行为也抽成接口:


interface QuackBehavior {
    fun quack()
}
class Squack: QuackBehavior {
    override fun quack() {
        println("我会叫,吱吱吱。。")
    }
}
class Quack: QuackBehavior {
    override fun quack() {
        println("我会叫,嘎嘎嘎")
    }
}

这基本已经大功告成了,我们已经把抽象类中的方法都抽出来了,现在的抽象类是这样:


abstract class Duck() {
    fun swim(){
        println("所有的鸭子都会游泳哦,所以直接写在了抽象类")
    }
    //显示
    abstract fun display()
}

现在就需要给抽象类中放入飞行和叫的接口了,注意:放接口,不放具体实现类,要针对接口编程,不要针对实现编程。


abstract class Duck(var flyBehavior: FlyBehavior? = null, var quackBehavior: QuackBehavior? = null) {
    fun swim(){
        println("所有的鸭子都会游泳哦,所以直接写在了抽象类")
    }
    //执行飞行操作
    fun performFly(){
        flyBehavior?.fly()
    }
    //执行鸭子叫操作
    fun performQuack(){
        quackBehavior?.quack()
    }
    //显示
    abstract fun display()
}


下面来看一个具体鸭子的例子:


class MallardDuck : Duck(flyBehavior = FlyWithWings(),quackBehavior = Quack()) {
    override fun display() {
        println("我是一个真鸭子")
    }
}

很简单,只需要在父类的构造参数中声明需要的具体实现即可。接下来该i到了测试了:

class Test {
    companion object {
        /** 我是main入口函数 **/
        @JvmStatic
        fun main(args: Array<String>) {
            val mallardDuck : Duck = MallardDuck()
            mallardDuck.display()
            mallardDuck.performFly()
            mallardDuck.performQuack()
            val modelDuck : Duck = ModelDuck()
            modelDuck.display()
            modelDuck.performFly()
            modelDuck.performQuack()
            modelDuck.swim()
        }
    }
}

可以看到,两种鸭子都是声明的子类指向了父类,子类实例化的动作不需要在代码中进行硬编码,而是在运行时才指定具体实现的对象。下面来运行下看下实现结果:

20191216104719914.png

结果没问题,成功。

文末总结

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



目录
相关文章
|
21天前
|
设计模式 算法 PHP
php设计模式--策略模式(六)
php设计模式--策略模式(六)
11 0
|
4月前
|
设计模式 算法 搜索推荐
设计模式之策略模式
设计模式之策略模式
41 0
|
4月前
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
3天前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
10 1
|
4月前
|
设计模式 算法 Java
【设计模式】策略模式在数据接收和发送场景的应用
在数据接收和发送场景打算使用了if else进行判断。ASystem.sync("向A同步数据");BSystem.sync("向B同步数据");...非常麻烦,需求多了很臃肿!策略模式(Strategy Pattern)定义了一组同类型的算法,在不同的类中封装起来,每种算法可以根据当前场景相互替换,从而使算法的变化独立于使用它们的客户端(即算法的调用者)。// 创建两个策略对象// 创建上下文对象,并传入策略对象。
60 1
|
5月前
|
设计模式 算法
设计模式思考,简单工厂模式和策略模式的区别?
设计模式思考,简单工厂模式和策略模式的区别?
|
21天前
|
设计模式 算法 搜索推荐
23种设计模式,策略模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】设计模式是软件工程中的一种最佳实践指导,用于解决常见的设计问题。它们被分类为创建型、结构型和行为型模式。其中,策略模式是一种行为型设计模式,旨在定义一系列算法,封装每一个算法,并使它们可互换。策略模式允许算法独立于使用它们的客户端变化
20 1
|
5月前
|
设计模式 Java
细说一下设计模式中的策略模式!
细说一下设计模式中的策略模式!
30 0
|
2月前
|
设计模式 算法
策略模式--设计模式
策略模式--设计模式
17 0
|
2月前
|
设计模式 算法 Java
【设计模式】策略模式
【设计模式】策略模式