美文网首页
设计模式01-策略者设计模式

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

作者: Thor_果冻 | 来源:发表于2018-12-29 15:27 被阅读0次

    @[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)模式

    相关文章

      网友评论

          本文标题:设计模式01-策略者设计模式

          本文链接:https://www.haomeiwen.com/subject/mrfplqtx.html