设计模式01-策略者设计模式

2018-12-29  本文已影响0人  Thor_果冻

@[toc]

策略者设计模式

主要来源Head First设计模式(书)

书中定义:策略者设计模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变换独立于使用算法的用户。
我的理解:我们的旅行方式:飞机、汽车、火车等都是一个策略。

设计模式入门

oo技术:面向对象技术
软件开发的真理:change

第一个设计原则

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混合在一起。也就是,把会变化的部分提取出来并'封装'起来,好让其他部分不受到影响

第二个设计原则

针对接口编程,而不是针对实现编程
“针对接口编程”真正意思是“针对超类型编程”,关键是“多态”

第三个原则

多组合,少继承

案例分析

首先定义策略的最上层

/**
 * 类描述:策略接口<br/>
 * 创建人:吴冬冬<br/>
 * 创建时间:2018/8/14 14:59 <br/>
 */
interface 策略接口 {
    fun 算法();
}

然后定义自己需要的策略(具体策略方式:也就是具体算法内容)

class 具体策略1 : 策略接口{
    override fun 算法() {
        Log.d("123===", "我是具体策略1")
    }
}
class 具体策略2 : 策略接口{
    override fun 算法() {
        Log.d("123===", "我是具体策略2")
    }
}
class 具体策略3 : 策略接口{
    override fun 算法() {
        Log.d("123===", "我是具体策略3")
    }
}

最后就是谁怎么调用这些策略

又想到调用者可能不同,也有可能需要改变其策略,所以分了超类型和子类型来定义

定义超类型

abstract class 超类型{
    protected lateinit var m策略: 策略接口
    fun set策略(新策略: 策略接口){
        m策略 = 新策略
    }
}

定义子类型

class 子类1 : 超类型(){
    init {
        m策略 = 具体策略1()
    }

    fun get策略(){
        m策略.算法()
    }
}
class 子类2 : 超类型(){
    init {
        m策略 = 具体策略2()
    }

    fun get策略(){
        m策略.算法()
    }
}
class 子类3 : 超类型(){
    init {
        m策略 = 具体策略3()
    }

    fun get策略(){
        m策略.算法()
    }
}

调用

//策略
val mZi1 = 子类1()
val mZi2 = 子类2()
val mZi3 = 子类3()
mZi1.get策略()
mZi2.get策略()
mZi3.get策略()
//重新为子类1定义策略
mZi1.set策略(具体策略3())
mZi1.get策略()

结果

我是具体策略1
我是具体策略2
我是具体策略3
我是具体策略3

最后放一张我画的uml(第一次画有错误请指正)

uml下载地址

策略设计模式uml

参考

Head First 设计模式(书)
菜鸟教程-策略模式
设计模式的征途—18.策略(Strategy)模式

上一篇下一篇

猜你喜欢

热点阅读