模板設計模式 - java語言描述

下面,我將用泡茶 和 泡咖啡的例子來描述模板設計模式的思想:

先來看看泡茶手冊:

  1. 燒開水
  2. 把茶葉放入被子中
  3. 把開水倒入杯子中
  4. 喝茶

泡咖啡手冊:

  1. 燒開水
  2. 把咖啡倒進杯子中
  3. 把開水倒進杯子中
  4. 喝咖啡

首先,如果不考慮什麼設計模式,現在讓我們來實現這兩個過程,我們可以用一下代碼實現:

運行結果:

運行結果:

但是這樣寫感覺有問題,這樣的話有許多代碼似乎是重複的,而且泡茶和泡咖啡的步驟很相似,所以,我們可以把他們放在一個父類裏面,把相同的步驟在父類中實現,不同的步驟交給子類去實現  ---- 模板設計模式。

父類代碼如下:其中泡茶和跑咖啡的步驟相同的部分放在父類中寫好,不同的定義爲抽象方法,交給子類去具體實現

茶類的實現:

運行結果:

咖啡類的實現:

運行結果:

費這麼大勁,這麼寫有什麼好處呢:

使用普通的方式 使用模板設計模式的方式
Coffee 或 Tea主導一切,控制算法 由父類主導一切,它擁有算法並且保護算法
Coffee 和 Tea 之間存在大量重複代碼

有父類存在,將代碼複用最大化

如果算法發生變化,需要在Coffee 和 Tea中做許多變化 算法只存在與一個地方,容易修改
代碼彈性差,有新飲料,相似的飲料加入需要做許多工作 彈性高,有新的相似的飲料加入只需要實現自己對應的一些方法

最後,在利用上面的這個例子,完整的在寫一遍模板設計模式的代碼,同時引入一種方法,叫 “鉤子” 方法,所謂的鉤子方法,舉個例子來說吧,就是比如有的人在喝咖啡的時候,會習慣加糖或牛奶,而有的習慣不加,所以在模板方法中引入鉤子方法,以便於用戶可以選擇是否要加這些東西。代碼如下:

父類代碼:

public abstract class Drink {

   public void boilingWater()
   {
       System.out.println("把水燒開...");
   }

   // 具體要添加的東西
   public abstract void addXxx() ;

   public void addWater()
   {
       System.out.println("加水...");
   }

   public abstract void drinkXxx() ;

   public boolean ifAddSugarAndMilk()
   {
       return true; // 默認返回真,在子類中再覆寫這個方法
   }

   public void addSugarAndMilk()
   {
       System.out.println("加糖和牛奶...");
   }

   public final void preparedWork()
   {
       boilingWater();
       addXxx();
       if (ifAddSugarAndMilk())
       {
           addSugarAndMilk();
       }
       addWater();
       drinkXxx();
   }

}

茶類:


public class Tea extends Drink {

    @Override
    public boolean ifAddSugarAndMilk() {
       return false; // 茶中不要牛奶和糖
    }

    @Override
    public void addXxx() {
        System.out.println("添加茶...");
    }

    @Override
    public void drinkXxx() {
        System.out.println("喝茶...");
    }

    public static void main(String[] args) {
        Drink tea = new Tea();
        tea.preparedWork();
    }
}

運行結果:

咖啡類:

import java.util.Scanner;

public class Coffee extends Drink {

    @Override
    public boolean ifAddSugarAndMilk() {
        System.out.println("你是否想加糖和牛奶(Y/N):");
        Scanner s = new Scanner(System.in);
        String str = s.next();
        if ("Y".equals(str)) {
            return true;
        }
        return false;
    }

    @Override
    public void addXxx() {
        System.out.println("添加咖啡...");
    }

    @Override
    public void drinkXxx() {
        System.out.println("喝咖啡...");
    }

    public static void main(String[] args) {
        Drink coffee = new Coffee();
        coffee.preparedWork();
    }
}

運行結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章