当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。提供了一个很好的代码复用平台。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。可以通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变的行为的纠缠。
一个抽象类,多个子类,一些方法按顺序执行,其中有部分方法是固定一样的,但是个别方法是不同子类有不同的实现。
/**
* 一个冲泡饮品的模板
*/
public abstract class DrinkTemplate {
/**
* (不是构造方法)
* 制作饮料方法模板
* 防止子类去修改
* 4个步骤 1、烧水 2、冲泡饮料 3、把饮料倒入杯中 4、加调料
*/
public final void drinkTemplate() {
this.boilWater(); //公用的烧水
this.brew(); //冲泡饮料
this.pourInCup(); //把饮料倒入杯子中
this.addCondiments(); //加调料
}
protected abstract void addCondiments(); //不同的子类加不同的调料
private void pourInCup(){
System.out.println("把饮品倒入杯子中。。。");
};
protected abstract void brew(); //不同的子类冲泡不同的饮料
private void boilWater(){
System.out.println("烧水中。。。");
};
}
/**
* 冲泡可乐
*/
public class Cola extends DrinkTemplate {
public Cola() {
super();
}
@Override
protected void addCondiments() {
System.out.println("可乐要加冰");
}
@Override
protected void brew() {
System.out.println("加入可乐粉");
}
}
/**
* 冲泡橙汁
*/
public class Orange extends DrinkTemplate{
public Orange() {
}
@Override
protected void addCondiments() {
System.out.println("橙汁要加冰");
}
@Override
protected void brew() {
System.out.println("加入橙汁粉");
}
}
public class Main {
public static void main(String[] args) {
DrinkTemplate drinkTemplate = new Cola();
drinkTemplate.drinkTemplate();
drinkTemplate = new Orange();
drinkTemplate.drinkTemplate();
}
}