22_模板方法模式

一、模板相关类

package com.study.template_method

abstract class HummerModel {
    
    
    var alarmFlag = false
    /**
     * 启动车辆
     */
    abstract fun start()

    /**
     * 停止车辆
     */
    abstract fun stop()

    /**
     * 滴滴叫
     */
    abstract fun alarm()

    /**
     * 发动机响声
     */
    abstract fun engineBoom()

    //暴露出方法,便于用户定义是否发出警报
    fun setAlarm(alarmFlag: Boolean) {
    
    
        this.alarmFlag = alarmFlag
    }

    fun isAlarm(): Boolean {
    
    
        return alarmFlag
    }

    /**
     * 运行方法,规定汽车启动步骤
     */
    fun run() {
    
    
        //先启动
        start()

        //引擎开始轰鸣
        engineBoom()

        if (isAlarm()) {
    
    
            //按喇叭
            alarm()
        }

        //到达目的地就停车
        stop()
    }

}
package com.study.template_method

class HummerH1Model : HummerModel() {
    
    
    override fun start() {
    
    
        println("悍马H1正在启动....")
    }

    override fun stop() {
    
    
        println("悍马H1正在停止....")
    }

    override fun alarm() {
    
    
        println("悍马H1发出警报....")
    }

    override fun engineBoom() {
    
    
        println("悍马H1引擎发出轰鸣声....")
    }

}
package com.study.template_method

class HummerH2Model : HummerModel() {
    
    
    override fun start() {
    
    
        println("悍马H2正在启动....")
    }

    override fun stop() {
    
    
        println("悍马H2正在停止....")
    }

    override fun alarm() {
    
    
        println("悍马H2发出警报....")
    }

    override fun engineBoom() {
    
    
        println("悍马H2引擎发出轰鸣声....")
    }

}

二、主程序调用

package com.study.template_method

/**
 * 模板方法模式:适合于流程式的事件处理
 *
 * 定义和类型
   定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
   模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤

   类型:行为型
   适用场景
   一次性实现一个算法的不变的部分,并且将可变的部分留给子类来实现
   各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复

    优点
    提高复用性
    提高扩展性
    符合开闭原则

    缺点
    类数目增加
    增加了系统实现的复杂度
    继承关系自身缺点,如果父类添加新的 抽象方法,所有子类都要改一遍
 */
fun main(args: Array<String>) {
    
    
    var h1 = HummerH1Model()
    h1.setAlarm(true)
    h1.run()

    var h2 = HummerH2Model()
    h2.run()
}

三、运行结果

猜你喜欢

转载自blog.csdn.net/Duckdan/article/details/111985081