本文主要是介绍模板模式——星巴克泡茶泡咖啡例题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1.模板设计模式介绍
- 2.星巴克咖啡泡茶问题举例
- 3.原码
- 4.钩子函数介绍
1.模板设计模式介绍
模板设计模式—基于抽象类的,核心是封装算法
-
模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供具体实现
-
在一个方法中定义一个算法的骨架,并将一些具体步骤延迟到子类中实现。
-
模板模式使得子类可以在不改变算法结构的基础上,重新具体定义算法中的某些步骤
2.星巴克咖啡泡茶问题举例
例如我要制作两种饮品:
coffee:
1.煮开水
2.用开水煮咖啡
3.将饮品倒入杯子中
4.加入牛奶和方糖
tea:
1.煮开水
2.用开水煮茶
3.将饮品倒入杯子中
4.加入柠檬
我们发现制作两种饮品制作过程当中1 3步骤重复,所以可以将他们在父类中实现,制作过程有差异的2 4步骤可以延迟到子类自行实现!
3.原码
abstract class Drink {final void make(){ //用final修饰确保制作顺序不会被改变boilWater(); //烧开水putCailiao(); //放入茶叶或者coffeepourCup(); //将饮品倒入杯子addSomething(); //加入配料}public void boilWater() {System.out.println("烧开水");}private void pourCup() {System.out.println("将饮品倒入杯中");}/** 咖啡和茶处理这些方法不同,因此这两个方法必须被声明为抽象,留给子类实现 */protected abstract void putCailiao(); //这些方法延迟到子类实现protected abstract void addSomething(); //这些方法延迟到子类实现}public class Tea extends Drink{@Overrideprotected void putCailiao() {System.out.println("煮茶叶了");}@Overrideprotected void addSomething() {System.out.println("加入了柠檬片");}
}public class Coffee extends Drink{@Overrideprotected void putCailiao() {System.out.println("开始煮咖啡");}@Overrideprotected void addSomething() {System.out.println("加入牛奶和糖");}
}public class Test {public static void main(String[] args) {Drink tea=new Tea();Drink coffee =new Coffee();tea.make();System.out.println();coffee.make();}
}
4.钩子函数介绍
- 钩子方法是一类"默认不做事的方法" ,子类可以视情况决定要不要覆盖它们。
- 比如说,顾客点杯咖啡时,可以选择加不加牛奶或者糖
abstract class Drink {final void make(){ //用final修饰确保制作顺序不会被改变boilWater(); //烧开水putCailiao(); //放入茶叶或者coffeepourCup(); //将饮品倒入杯子if(ifCustomerWant()){addSomething(); //加入配料}}void boilWater() {System.out.println("烧开水");}void pourCup() {System.out.println("将饮品倒入杯中");}protected abstract void putCailiao();protected abstract void addSomething();boolean ifCustomerWant(){ //钩子函数默认执行return true;}
}import java.util.Scanner;
public class Coffee extends Drink{@Overrideprotected void putCailiao() {System.out.println("开始煮咖啡");}@Overrideprotected void addSomething() {System.out.println("加入牛奶和糖");}/*** 子类覆写钩子函数*/boolean ifCustomerWant(){System.out.println("请问需要加入牛奶和方糖吗(yes/no)");Scanner sc=new Scanner(System.in);String str=sc.nextLine();if(str.equals("yes")){return true;}else{return false;}}
}
这篇关于模板模式——星巴克泡茶泡咖啡例题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!