城市猎人

在一网情深的日子里,谁能说得清是苦是甜,只知道确定了就义无反顾
posts - 1, comments - 7, trackbacks - 0, articles - 89

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

Posted on 2008-07-26 08:25 sailor 阅读(190) 评论(0)  编辑  收藏 所属分类: 模式

定义
        在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些

步骤。
    

钩子
    钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。要不要挂钩有子类自己决定。

    目的:
    钩子可以让子类实现算法中的可选部分,或者在钩子对子类的实现并不重要的时候,子类可以对此钩子置之不理。

要点
    1、“模板方法”定义了算法的步骤,把这些步骤的实现延迟到子类;
    2、模板方法模式为我们提供了一种代码复用的可重要技巧;
    3、模板方法的抽象类可以定义具体方法抽象方法钩子;
    4、抽象方法由子类实现;
    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    //由子类实现方法
20    abstract void brew();
21    
22    //由子类实现方法
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

只有注册用户登录后才能发表评论。


网站导航: