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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值