城市獵人

          在一網情深的日子里,誰能說得清是苦是甜,只知道確定了就義無反顧
          posts - 1, comments - 7, trackbacks - 0, articles - 89

          模式(九):模板方法(Template Method)模式

          Posted on 2008-07-26 08:25 sailor 閱讀(195) 評論(0)  編輯  收藏 所屬分類: 模式

          定義
                  在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些

          步驟。
              

          鉤子
              鉤子是一種被聲明在抽象類中的方法,但只有空的或者默認的實現(xiàn)。鉤子的存在,可以讓子類有能力對算法的不同點進行掛鉤。要不要掛鉤有子類自己決定。

              目的:
              鉤子可以讓子類實現(xiàn)算法中的可選部分,或者在鉤子對子類的實現(xiàn)并不重要的時候,子類可以對此鉤子置之不理。

          要點
              1、“模板方法”定義了算法的步驟,把這些步驟的實現(xiàn)延遲到子類;
              2、模板方法模式為我們提供了一種代碼復用的可重要技巧;
              3、模板方法的抽象類可以定義具體方法抽象方法鉤子;
              4、抽象方法由子類實現(xiàn);
              5、鉤子是一種方法,它在抽象類中不做事,或者只做默認的事情,子類可以選擇要不要覆蓋它;
              6、為了防止子類改變模板算法中的方法,可以用將模板方法聲明為final;
              7、好萊塢原則告訴我們,將決策權放在高層模塊中,以便決定如何以及何時調用底層模塊。

          實例



          CaffeineBeverage.java

           1
           2package com.sailor.templateMethod;
           3
           4/**
           5 * @author sailor
           6 * Jul 26, 2008 8:26:42 AM
           7 */

           8public abstract class CaffeineBeverage {
           9
          10    final void prepareRecipe(){
          11        boilWater();
          12        brew();
          13        pourInCup();
          14        if(customerWantsCondiments()){
          15            addCondiments();
          16        }

          17    }

          18    
          19    //由子類實現(xiàn)方法
          20    abstract void brew();
          21    
          22    //由子類實現(xiàn)方法
          23    abstract void addCondiments();
          24    
          25    final void boilWater(){
          26        System.out.println("Boilding water");
          27    }

          28    
          29    final void pourInCup(){
          30        System.out.println("Pouring into cup");
          31    }

          32    
          33    //這是一個鉤子,子類可以覆蓋也可以不覆蓋
          34    public boolean customerWantsCondiments(){
          35        return true;
          36    }

          37}

          38

           1package com.sailor.templateMethod;
           2
           3import java.io.BufferedReader;
           4import java.io.IOException;
           5import java.io.InputStreamReader;
           6
           7/**
           8 * @author sailor
           9 * Jul 26, 2008 8:38:54 AM
          10 */

          11public class Coffee extends CaffeineBeverage{
          12
          13
          14    @Override
          15    void addCondiments() {
          16        System.out.println("Dripping Coffee throug filter");
          17    }

          18
          19    @Override
          20    void brew() {
          21        System.out.println("Adding Sugar and Milk");    
          22    }

          23
          24    @Override
          25    public boolean customerWantsCondiments() {
          26
          27        String answer = getUserInput();
          28        
          29        if(answer.toLowerCase().startsWith("y"))
          30            return true;
          31        else
          32            return false;
          33    }

          34
          35    private String getUserInput(){
          36        String answer = null;
          37        
          38        System.out.println("Would you liak milk and sugar with your coffee(y/n)?");
          39        
          40        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          41        
          42        try {
          43            answer = br.readLine();
          44        }
           catch (IOException e) {
          45            e.printStackTrace();
          46        }

          47        
          48        if(answer == null){
          49            return "no";
          50        }

          51        
          52        return answer;
          53    }

          54}

          55


           1
           2package com.sailor.templateMethod;
           3
           4/**
           5 * @author sailor
           6 * Jul 26, 2008 8:32:03 AM
           7 */

           8public class Tea extends CaffeineBeverage{
           9
          10    @Override
          11    public void addCondiments() {
          12        System.out.println("Steeping the tea");
          13    }

          14
          15    @Override
          16    public void brew() {
          17        System.out.println("Adding lemon");
          18    }

          19
          20
          21}

          22


           1package com.sailor.templateMethod;
           2
           3/**
           4 * @author sailor
           5 * Jul 26, 2008 8:34:30 AM
           6 */

           7public class Client {
           8    
           9    public static void main(String args[]){
          10//        Tea myTea = new Tea();
          11//        myTea.prepareRecipe();
          12        
          13        Coffee myCoffee = new Coffee();
          14        myCoffee.prepareRecipe();
          15        System.out.println("end");
          16    }

          17    
          18}

          19
          主站蜘蛛池模板: 阳原县| 东丽区| 宁德市| 达尔| 武汉市| 巨鹿县| 曲麻莱县| 手机| 彩票| 阿城市| 桦川县| 洪湖市| 射洪县| 翁源县| 临湘市| 灵山县| 普宁市| 安溪县| 苏尼特左旗| 若羌县| 台中市| 牟定县| 夏津县| 蚌埠市| 凤翔县| 临沂市| 明水县| 平昌县| 安陆市| 加查县| 永城市| 玉溪市| 科技| 阳山县| 和硕县| 锡林郭勒盟| 伊通| 中西区| 和龙市| 石门县| 开江县|