首页 > 代码库 > 设计模式-------模板方法模式

设计模式-------模板方法模式

模板方法模式定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

 

抽象类的父类,父类中定义了基本方法,模板方法和钩子方法。

基本方法:父类中定义,在子类中实现。

模板方法:父类中实现,调用基本方法,子类继承。

钩子方法:在父类中定义,变相的实现父类调用子类的方法。

 

具体例子如下:

父类:

 1 package pattern.templateMethod;
 2 
 3 public abstract class HummerModel {
 4 
 5     // 基本方法
 6     protected abstract void start();
 7 
 8     // 基本方法
 9     protected abstract void stop();
10 
11     // 基本方法
12     protected abstract void alarm();
13 
14     // 基本方法
15     protected abstract void engineBoom();
16 
17     // 模板方法
18     protected void run() {
19         this.start();
20         this.engineBoom();
21         if (this.isAlarm()) {
22             this.alarm();
23         }
24         this.stop();
25     }
26 
27     // 钩子方法
28     protected boolean isAlarm() {
29         return true;
30     }
31 
32 }

 

子类1:

 1 package pattern.templateMethod;
 2 
 3 public class HummerH1Model extends HummerModel {
 4 
 5     private boolean alarmFlag = true;
 6     
 7     @Override
 8     protected void start() {
 9 
10         System.out.println("H1 start....");
11     }
12 
13     @Override
14     protected void stop() {
15         System.out.println("H1 stop.....");
16     }
17 
18     @Override
19     protected void alarm() {
20         System.out.println("H1 alarm.....");
21     }
22 
23     @Override
24     protected void engineBoom() {
25         System.out.println("H1 engineBoom");
26     }
27     
28     @Override
29     protected boolean isAlarm() {
30         return this.alarmFlag;
31     }
32     
33     public void setAlarm(boolean isAlarm){
34         this.alarmFlag = isAlarm;
35     }
36 
37 
38 }

 

子类2:

package pattern.templateMethod;

public class HummerH2Model extends HummerModel {

    @Override
    protected void start() {

        System.out.println("H2 start....");
    }

    @Override
    protected void stop() {
        System.out.println("H2 stop.....");
    }

    @Override
    protected void alarm() {
        System.out.println("H2 alarm.....");
    }

    @Override
    protected void engineBoom() {
        System.out.println("H2 engineBoom");
    }


}

alarm方法是否调用由子类中的setAlarm决定,实现了在父类中调用子类的方法。

设计模式-------模板方法模式