模板方法模式:
在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类看可以在不改变算法结构的情况下,重新定义算法的某些步骤。
涉及设计原则:
1.好莱坞原则:别调用我们,我们会调用你
2.为交互对象之间的松耦合设计而努力
问题简单描述:
创建咖啡和茶的步骤很类似,把水煮沸->冲泡->倒进杯子->加配料,其中第一步第三步是同样的方法,冲泡和加配料具体操作不同。有没有一种方法减少代码的重复性,又可以保留两者的不同。
解决思路:
创建一个父类,将相同的方法实现,不同的方法定义为抽象方法,并提供一个规定了制作步骤的模板方法。茶跟咖啡都继承这个父类,实现其中的抽象方法,调用者只需调用模板方法完成制作。
UML图:
实现代码:
模板方法基类
package templateMethod;
/**
* 咖啡因饮料基类(包含规定了算法结构的模板方法)
* @author terry
*
*/
public abstract class CoffeineBeverage {
//模板方法,规定了算法结构,子类不得改变
final void prepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
}
//冲泡(不同子类实现方法不同)
abstract void brew();
//加配料(钩子)
void addCondiments(){
//默认不加配料,在子类中可以改变
System.out.println("add no condiments");
}
//烧水(任何子类都同样的方法)
final void boilWater(){
System.out.println("Boiling water");
}
//倒进杯子(任何子类都相同的方法)
final void pourInCup(){
System.out.println("Pouring into Cup");
}
}
实现类
package templateMethod;
/**
* 茶子类(继承模板方法基类)
* @author terry
*
*/
public class Tea extends CoffeineBeverage{
@Override
void brew() {
//子类实现抽象方法
System.out.println("Steepint the tea");
}
void addCondiments(){
//子类可以覆盖钩子方法
System.out.println("add some lemon");
}
}
package templateMethod;
/**
* 咖啡子类(继承模板方法基类)
* @author terry
*
*/
public class Coffee extends CoffeineBeverage{
@Override
void brew() {
System.out.println("Driping coffee through filter");
}
}
测试类
package templateMethod;
public class Test {
public static void main(String[] args){
Tea tea=new Tea();
Coffee coffee=new Coffee();
System.out.println("Making tea……");
tea.prepareRecipe();
System.out.println("Making coffee……");
coffee.prepareRecipe();
}
}
运行结果
欢迎批评指正 ^ ^