浅谈模板设计模式-------------基于抽象类的设计模式。

本文通过泡咖啡与泡茶的实例,介绍了如何使用抽象类减少重复代码。通过定义抽象类CaffeineBeverage及其实现类Coffee和Tea,展示了如何通过抽象方法和钩子方法实现不同饮品的通用与特定步骤。

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

--------问题引入:

咖啡与茶在制作过程中烧水与倒入杯中的过程中重复操作,

 将这两个方法提取出来,放在基类中,然后让咖啡与茶都继承此父类

 

1.泡咖啡

  • 烧水
  • 泡咖啡
  • 倒入杯子中
  • 加糖

2.泡茶

  • 烧水
  • 浸泡茶
  • 倒入杯子中
  • 加枸杞

从以上的两个冲泡动作来看,不论是泡茶还是泡咖啡都有一些重复编写的代码

我们可以用抽象类来减少代码的重复量。

假设抽象类为CoffeeineBeverage

抽象方法有两个:brewBeverage()//冲泡茶或者冲泡咖啡和addCondiments()//加糖/加枸杞

Coffee类和Tea类拥有的两个共同的方法:boilWater():和pourIncup();

下面是源码:

abstract  class CaffeinBeverage{//Beverage------饮料
    //核心算法,子类只能使用
    public final void prepareRecipe(){
        boilWater();
        brewBeverage();//冲泡饮料
        pourIncup();
        addCondiments();
    }
    public void boilWater(){
        System.out.println("将水烧开");
    }
    public void pourIncup(){
        System.out.println("将饮料倒入杯中");
    }
    public abstract void brewBeverage();
    public abstract void addCondiments();
}
class Coffee extends CaffeinBeverage{

public void brewBeverage(){
    System.out.println("泡咖啡");
}
public void addCondiments(){
    System.out.println("加糖");
}
}
class Tea extends CaffeinBeverage{

    public void brewBeverage(){
        System.out.println("泡茶");
    }
    public void addCondiments(){
        System.out.println("加枸杞");
    }
}
public class Test{
    public static void main(String[] args) {
        CaffeinBeverage coffee=new Coffee();
        System.out.println("给大佬泡咖啡");
        coffee.prepareRecipe();
        CaffeinBeverage tea=new Tea();
        System.out.println("给大佬泡茶");
        tea.prepareRecipe();
    }
}

运行结果:

给大佬泡咖啡

将水烧开

泡咖啡

将饮料倒入杯中

加糖

给大佬泡茶

将水烧开

泡茶

将饮料倒入杯中

加枸杞

钩子方法

一种默认不做事的方法,子类可以视情况决定要不要覆盖他们

abstract  class CaffeinBeverage{//Beverage------饮料
    //核心算法,子类只能使用
     final void prepareRecipe(){
        boilWater();
        brewBeverage();//冲泡饮料
        pourIncup();
        if(customerWantsCondiments()){
            addCondiments();
         }
    }

    void boilWater(){
        System.out.println("将水烧开");
    }
    void pourIncup(){
        System.out.println("将茶倒入杯中");
    }
    abstract void brewBeverage();
    abstract void addCondiments();
    //子类可以选择性的覆写此方法
    boolean customerWantsCondiments(){
        return true;
}
}

class Tea extends CaffeinBeverage{

    public void brewBeverage(){
        System.out.println("泡茶");
    }
    public void addCondiments(){
        System.out.println("加枸杞");
    }
    public boolean customerWantsCondiments(){
        String answer=getUserInput();
        if(answer.equals("y")){
            return true;
        }else{
            return false;
        }
    }
    private String getUserInput(){
        String answer=null;
        System.out.println("你想要在咖啡或者茶中加东西吗(输入y/n)?");
        Scanner scanner=new Scanner(System.in);

        answer=scanner.nextLine();
        return answer;
    }
}
public class Test{
    public static void main(String[] args) {
        CaffeinBeverage tea=new Tea();
        System.out.println("给大佬泡茶");
        tea.prepareRecipe();
    }
}

输出结果:

给大佬泡茶

将水烧开

泡茶

将茶倒入杯中

你想要在咖啡或者茶中加东西吗(输入y/n)?

y

加枸杞

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值