1.定义
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
2.栗子来喽
首先,我们举一个熟悉的栗子,咖啡和茶已成为日常饮品,那么我们就用这个举例吧。
咖啡冲泡法:
(1)煮沸水;(2)用沸水冲泡咖啡;(3)将咖啡倒进杯子;(4)加糖和奶
茶冲泡法:
(1)煮沸水;(2)用沸水冲泡茶叶;(3)将茶倒进杯子里;(4)加柠檬
程序实现中,等一下哦;
哈,来了来了
//咖啡冲泡类
class Coffee{
void prepare(){
boilWater();
brewCoffeeGrings();
pourInCup();
addSugarOrMilk();
}
public void boilWater(){
System.out.println("煮沸水");
}
public void brewCoffeeGrings(){
System.out.println("沸水冲泡咖啡");
}
public void pourInCup(){
System.out.println("咖啡倒进杯子里");
}
public void addSugarOrMilk(){
System.out.println("加糖或牛奶");
}
}
class Tea{
void prepare(){
boilWater();
steepTeaBag();
pourInCup();
addLemon();
}
public void boilWater(){
System.out.println("煮沸水");
}
public void steepTeaBag(){
System.out.println("沸水冲泡茶");
}
public void pourInCup(){
System.out.println("茶倒入杯子里");
}
public void addLemon(){
System.out.println("加柠檬");
}
}
呐,这时的类图应该是这样的:
但是,在编写程序时,会发现有很多重复的代码,这是很浪费资源的。茶和咖啡的冲泡法都使用了相同的算法,所以可以把它抽象出来,成为一个单独的基类。
abstract class CaffeineBeverage{
final void prepare(){
boilWater();
brew();
pourInCup();
addCondiments();
}
void boilWater(){
System.out.println("煮沸水");
}
void pourInCup(){
System.out.println("倒入杯子里");
}
//将这些方法定义为抽象方法,方便子类扩展
abstract void brew();
abstract void addCondiments();
}
咖啡和茶可以通过继承这个基类来完成冲泡算法
class Coffee extends CaffeineBeverage{
@Override
void brew() {
System.out.println("沸水冲泡咖啡");
}
@Override
void addCondiments() {
System.out.println("加糖或牛奶");
}
}
class Tea extends CaffeineBeverage{
@Override
void brew() {
System.out.println("沸水冲泡茶");
}
@Override
void addCondiments() {
System.out.println("加柠檬");
}
}
此时的类图应该是这样的:
最后,完善一下程序
abstract class CaffeineBeverage{
final void prepare(){
boilWater();
brew();
pourInCup();
if(customerWantsCondiments()){
addCondiments();
}
}
void boilWater(){
System.out.println("煮沸水");
}
void pourInCup(){
System.out.println("倒入杯子里");
}
//将这些方法定义为抽象方法,方便子类扩展
abstract void brew();
abstract void addCondiments();
//子类可以选择性的覆写该方法
boolean customerWantsCondiments(){
return true;
}
}
class Coffee extends CaffeineBeverage{
@Override
void brew() {
System.out.println("沸水冲泡咖啡");
}
@Override
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;
}
}
class Tea extends CaffeineBeverage{
@Override
void brew() {
System.out.println("沸水冲泡茶");
}
@Override
void addCondiments() {
System.out.println("加柠檬");
}
}
public class Test05 {
public static void main(String[] args) {
CaffeineBeverage coffee = new Coffee();
CaffeineBeverage tea = new Tea();
System.out.println("\nMaking coffee...");
coffee.prepare();
System.out.println("\nMaking tea...");
tea.prepare();
}
}
这就是咖啡和茶的冲泡算法。欢迎补充哦。
一起学习,一起进步(耶耶耶)