--------问题引入:
咖啡与茶在制作过程中烧水与倒入杯中的过程中重复操作,
将这两个方法提取出来,放在基类中,然后让咖啡与茶都继承此父类
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
加枸杞