Java设计模式——模板设计模式
1、定义
模板设计模式是基于抽象类实现的,核心是算法的封装。
模板方法:定义了一个算法的步骤(用final修饰),并允许子类为该算法的一个或多个步骤提供具体实现
模板(模板方法)模式:在一个方法中定义一个算法的骨架,并将一些具体步骤延迟到子类中实现,模板模式使得子类可以在不改变算法结构的基础上,重新定义算法中的某些步骤。
2、应用场景
Servlet,AQS,咖啡冲泡法
3、总结
模板模式:
①抽象类+核心算法:定义一个算法的骨架,具体步骤延迟到子类中实现
②final修饰的普通方法:所有子类共用
③抽象方法:延迟到子类实现
就是将核心的算法用final修饰(应用于大多数步骤几乎相同的几个子类中),然后核心算法中调用的某些其他方法(各个子类的具体实现不太相同),这些方法再基类中使用抽象类,将具体的实现延迟到子类中。
4、实例解析
先定义一个"模板"(基类),将核心算法使用final修饰,要延迟到的子类的方法使用abstract修饰。由于该类中存在抽象方法,因此该类需要被声明为抽象类。
基类:冲泡法
// 基类(核心算法+抽象方法)
abstract class CoffeeinBeverage{
// 冲泡的核心算法
final void prepareRecipe(){
boilWater();
brew();
pourInCup();
if(customWantsCondiments()){
add();
}
}
// 所有子类所共用的方法,煮水,倒入杯
void boilWater(){
System.out.println("将水煮沸");
}
void pourInCup(){
System.out.println("倒入杯中");
}
// 默认设为返回true,利用继承的关系,子类如果需要改为false就将该方法覆写
// 否则就会使用默认设置
boolean customWantsCondiments(){
return true;
}
// 需要延迟到子类实现的方法,泡什么东西,添加什么调料
abstract void brew();
abstract void add();
}
定义不同的子类继承该抽象类
// 咖啡类
class Coffee extends CoffeeinBeverage{
void brew(){
System.out.println("用水冲泡咖啡");
}
void add(){
System.out.println("加糖和牛奶");
}
boolean customWantsCondiments(){
String answer = getUserInfo();
if(answer.equals("y")){
return true;
}else{
return false;
}
}
private String getUserInfo(){
Scanner scanner = new Scanner(System.in);
System.out.println("您想在咖啡中加入牛奶和糖吗?(y/n)");
String result = scanner.nextLine();
return result;
}
}
// 茶类
class Tea extends CoffeeinBeverage{
void brew(){
System.out.println("用水浸泡茶叶");
}
void add(){
System.out.println("加柠檬");
}
}