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

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

代码实现:
(1)创建一个CaffineBeverage抽象类,并声明两个抽象方法供子类实现。


public abstract class CaffineBeverage {
    final void prepareRecipe(){
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()){
            addCondiments();
        }
    }

    abstract void brew();
    abstract void addCondiments();

    void boilWater(){
        System.out.println("Boiling water");
    }

    void pourInCup(){
        System.out.println("Pouring into cup");
    }

    boolean customerWantsCondiments(){
        return true;
    }
}

(2)继承CaffineBeverage,并实现相应的抽象方法

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class CoffeeWithHook extends CaffineBeverage {

    @Override
    void brew() {
        // TODO Auto-generated method stub
        System.out.println("Driping coffee through filter");
    }

    @Override
    void addCondiments() {
        // TODO Auto-generated method stub
        System.out.println("adding condiments");
    }

    public boolean customerWantsCondiments(){
        String answer = getUserInput();

        if (answer.toLowerCase().startsWith("y")){
            return true;
        } else {
            return false;
        }
    }

    private String getUserInput(){
        String answer = null;
        System.out.println("Would you like milk and sugar with your coffee (y/n)?");
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        try {
            answer = in.readLine();
        } catch (IOException ioe) {
            System.out.println("IO error trying to read your answer");
        }
        if (answer == null){
                return "no";
        }
        return answer;

    }
}

public class TeaWithHook extends CaffineBeverage {

    @Override
    void brew() {
        // TODO Auto-generated method stub
        System.out.println("Steeping the tea");
    }

    @Override
    void addCondiments() {
        // TODO Auto-generated method stub
        System.out.println("Adding lemon");
    }

    public boolean customerWantsCondiments(){
        String answer = getUserInput();

        if (answer.toLowerCase().startsWith("y")){
            return true;
        } else {
            return false;
        }
    }

    private String getUserInput(){
        String answer = null;
        System.out.println("Would you like lemon with your tea (y/n)?");
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        try {
            answer = in.readLine();
        } catch (IOException ioe) {
            System.out.println("IO error trying to read your answer");
        }
        if (answer == null){
                return "no";
        }
        return answer;

    }

}

(4)测试代码


public class BeverageTestDrive {
    public static void main(String args[]){

        TeaWithHook teaHook = new TeaWithHook();
        CoffeeWithHook coffeeHook = new CoffeeWithHook();

        System.out.println("Making coffee");
        teaHook.prepareRecipe();

        System.out.println("Making coffee");
        coffeeHook.prepareRecipe();
    }
}

猜你喜欢

转载自blog.csdn.net/MoonShinesOnMyWay/article/details/81366758