模板模式

本文深入探讨了模板方法模式在实际应用中的具体案例,通过类CaffeineBeverageWithHook及其子类CoffeeWithHook和TeaWithHook的实现,展示了如何在不改变算法结构的情况下,重新定义算法中的某些步骤,以实现泡茶和泡咖啡的不同需求。文章详细解释了模板方法模式的概念、特点及其实现细节,并提供了相应的代码示例,以便读者理解和应用这一设计模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。



例子:泡茶和泡咖啡:

类CaffeineBeverageWithHook
public abstract class CaffeineBeverageWithHook {
    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("Boiling water");
    }
    boolean customerWantsCondiments(){
        return true;
    }

}

类CoffeeWithHook:

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


public class CoffeeWithHook extends CaffeineBeverageWithHook{
    public void brew()
    {
        System.out.println("Dripping Coffee through filter");
    }
    public void addCondiments(){
        System.out.println("Adding Sugar and Milk");
    }

    public boolean customerWantsCondiments(){
        String answer = getUserInput();
        if(answer.toLowerCase().startsWith("y")){
            return true;
        }else{
            return false;
        }
    }
    private String getUserInput(){
        String answer=null;
        System.out.print("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.err.println("IO error trying to read your answer");
        }
        if (answer ==null)
        {
            return "no";
        }
        return answer;
    }
}

类TeaWithHook:


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


    public class TeaWithHook extends CaffeineBeverageWithHook{
        public void brew()
        {
            System.out.println("Dripping tea through filter");
        }
        public void addCondiments(){
            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.print("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.err.println("IO error trying to read your answer");
            }
            if (answer ==null)
            {
                return "no";
            }
            return answer;
        }
    }


测试:
public class BeverageTestDrive {
    public static void main(String[] args)
    {
        CaffeineBeverageWithHook teaHook = new TeaWithHook();
        CaffeineBeverageWithHook coffeeHook = new CoffeeWithHook();
        System.out.println("\n making tea...");
        teaHook.prepareRecipe();
        System.out.println("\n making coffee...");
        coffeeHook.prepareRecipe();
        
    }

}

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

Hook Method:提供缺省的实现,子类可以在必要时进行扩展,钩子简化了子类的实现,它可以让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤做出反应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惹不起的程咬金

来都来了,不赏点银子么

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值