模板方法设计模式

package 模板方法模式;

public abstract class HummerModel {

    public abstract void start();
    public abstract void stop();
    public abstract void alarm();
    public abstract void engineBoom();
    public abstract void run();

}
package 模板方法模式;

public class HummerH1Model extends HummerModel{

    @Override
    public void start() {
        System.out.println("H1启动");
    }

    @Override
    public void stop() {
        System.out.println("H1停车");
    }

    @Override
    public void alarm() {
        System.out.println("H1鸣笛");
    }

    @Override
    public void engineBoom() {
        System.out.println("H1引擎轰鸣声");
    }

    @Override
    public void run() {
        //先启动
        this.start();
        //引擎发声
        this.engineBoom();
        //鸣笛
        this.alarm();
        this.stop();
    }

}
package 模板方法模式;

public class HummerH2Model extends HummerModel{

    @Override
    public void start() {
        System.out.println("H2启动");

    }

    @Override
    public void stop() {

        System.out.println("H2停车");
    }

    @Override
    public void alarm() {

        System.out.println("H2鸣笛");

    }

    @Override
    public void engineBoom() {

        System.out.println("H2引擎发声");

    }

    @Override
    public void run() {
        //先启动
                this.start();
                //引擎发声
                this.engineBoom();
                //鸣笛
                this.alarm();
                this.stop();
    }

}
  1. 程序写到这里有一个问题就是两个类的实现run方法相同,因此要把这个run方法抽象到抽象类中,不应该在实现类中写。
    代码修改为:
package 模板方法模式;

public abstract class HummerModel {

    public abstract void start();
    public abstract void stop();
    public abstract void alarm();
    public abstract void engineBoom();

    public void run() {
        //先启动
                this.start();
                //引擎发声
                this.engineBoom();
                //鸣笛
                this.alarm();
                this.stop();
    }
}
package 模板方法模式;

public class HummerH1Model extends HummerModel{

    @Override
    public void start() {
        System.out.println("H1启动");
    }

    @Override
    public void stop() {
        System.out.println("H1停车");
    }

    @Override
    public void alarm() {
        System.out.println("H1鸣笛");
    }

    @Override
    public void engineBoom() {
        System.out.println("H1引擎轰鸣声");
    }



}
package 模板方法模式;

public class HummerH2Model extends HummerModel{

    @Override
    public void start() {
        System.out.println("H2启动");

    }

    @Override
    public void stop() {

        System.out.println("H2停车");
    }

    @Override
    public void alarm() {

        System.out.println("H2鸣笛");

    }

    @Override
    public void engineBoom() {

        System.out.println("H2引擎发声");

    }



}
  1. 模板方法的定义:
    定义一个算法的操作框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法某些特定的步骤。
    基本方法:由子类实现的方法,并且在模板方法中调用
  2. 模板方式的应用
    模板方式的优点:封装不变部分,扩展可变部分。提取公共部分的代码,便于维护;行为由父类控制,子类实现。
  3. 模板方法的应用场景
    多个子类有共有的方法,并且逻辑基本相同
    重要复杂的算法,可以吧核心的算法设计为模板方法,周边的具体实现的细节可由子类实现。
    重构时,模板方法的设计模式是一个经常用的设计模式,把相同的代码抽取到父类中,然后通过钩子函数来约束行为。

  4. 模板方法模式的扩展

package 模板方法模式;

public abstract class HummerModel {

    public abstract void start();
    public abstract void stop();
    public abstract void alarm();
    public abstract void engineBoom();

    final public void run() {
        //先启动
                this.start();
                //引擎发声
                this.engineBoom();
                //鸣笛
                if (isAlarm()) {
                    this.alarm();
                }

                this.stop();
    }

    //钩子函数
    protected boolean isAlarm(){
        return true;
    }

}
package 模板方法模式;

public class HummerH1Model extends HummerModel{

    private boolean alarmFlag = true;//要喇叭

    @Override
    public void start() {
        System.out.println("H1启动");
    }

    @Override
    public void stop() {
        System.out.println("H1停车");
    }

    @Override
    public void alarm() {
        System.out.println("H1鸣笛");
    }

    @Override
    public void engineBoom() {
        System.out.println("H1引擎轰鸣声");
    }

    protected boolean isAlarm(){
        return this.alarmFlag;
    }

    //要不要响喇叭,是有客户控制的
    public void setAlarm(boolean isAlarm){
        this.alarmFlag = isAlarm;
    }



}
package 模板方法模式;

public class HummerH2Model extends HummerModel{

    @Override
    public void start() {
        System.out.println("H2启动");

    }

    @Override
    public void stop() {

        System.out.println("H2停车");
    }

    @Override
    public void alarm() {

        System.out.println("H2鸣笛");

    }

    @Override
    public void engineBoom() {

        System.out.println("H2引擎发声");

    }


    //默认没有喇叭的
    public boolean isAlarm(){
        return false;
    }


}
package 模板方法模式;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Client {

    public static void main(String[] args) throws IOException {
        System.out.println("-----H1-----");
        String type = (new BufferedReader(new InputStreamReader(System.in))).readLine();
        HummerH1Model h1 = new HummerH1Model();
        if (type.equals("0")) {
            h1.setAlarm(false);
        }
        h1.run();
        System.out.println("-----H2-----");
        HummerH2Model h2 = new HummerH2Model();
        h2.run();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值