0%

Java设计模式之模板方法模式

模板方法模式是由模板(抽象类)定义子方法执行顺序,子类实现子方法,其实很简单,我们平时很常用,只是不知道这个叫模板方法模式罢了。 定义模板(父类):

package com.pocketdigi.patterns.templatemethod;

public abstract class HummerModel {
    /**
     * 这个叫基本方法,子类可以覆盖
     * 基本方法分三类,在抽象类中实现了的基本方法叫做具体方法;
     * 在抽象类中没有实现,在子类中实现了叫做抽象方法
     * 可以改变模板方法行为的叫钩子方法
     * 不允许外部直接调用这些方法,所以用protected
     */
    protected abstract void start();
    protected abstract void stop();
    protected abstract void alarm();
    protected abstract void engineBoom();
    /**
     * 这个叫钩子方法
     * @return
     */
    protected boolean isAlarm()
    {
        return true;
    }
    /**
     * 定义了其他方法的执行顺序,并且子类不能修改,叫模板方法
     */
    public final void run(){
        start();
        engineBoom();
        //钩子方法改变行为
        if(isAlarm())
        {
            alarm();
        }
        stop();
        
    }
}

不同的子类实现:

package com.pocketdigi.patterns.templatemethod;

public class HummerH1 extends HummerModel {

    @Override
    protected void start() {
        // TODO Auto-generated method stub
        System.out.println("悍马H1启动");
    }

    @Override
    protected void stop() {
        // TODO Auto-generated method stub
        System.out.println("悍马H1停止");
    }

    @Override
    protected void alarm() {
        // TODO Auto-generated method stub
        System.out.println("悍马H1鸣笛");
    }

    @Override
    protected void engineBoom() {
        // TODO Auto-generated method stub
        System.out.println("悍马H1引擎轰鸣");
    }

}



package com.pocketdigi.patterns.templatemethod;

public class HummerH2 extends HummerModel {
    boolean isAlarm;
    @Override
    protected void start() {
        // TODO Auto-generated method stub
        System.out.println("悍马H2启动");
    }

    @Override
    protected void stop() {
        // TODO Auto-generated method stub
        System.out.println("悍马H2停止");
    }

    @Override
    protected void alarm() {
        // TODO Auto-generated method stub
        System.out.println("悍马H2鸣笛");
    }

    @Override
    protected void engineBoom() {
        // TODO Auto-generated method stub
        System.out.println("悍马H2引擎轰鸣");
    }
    /**
     * 覆盖钩子方法
     */
    @Override
    protected boolean isAlarm() {
        // TODO Auto-generated method stub
        return isAlarm;
    }

    public void setAlarm(boolean isAlarm) {
        this.isAlarm = isAlarm;
    }
    
}