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()
}

三、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值