模板方法设计模式在实际开发中是一种使用非常广泛的设计模式,也是一种非常重要的思想。其核心内容为:通过定义一个模板类,在模板类中规定其整体的骨架并确定哪些方法是允许子类去重写,哪些不允许子类重写或者哪些必须子类重写,其目的是保证其核心算法不被破坏。定义完模板类后,写出具体的子类去继承模板类并按规定好的框架来完成子类的定义。
模板方法设计模式适用于算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
举个例子,在炒菜的时候步骤都是一样的,区别就是放的菜,放的调料不同,这个时候就可以设计一套模板,按照这个模板去炒菜
package day726.a;
public abstract class AbstractCook {
// 倒油
public final void PourOil(){
System.out.println("倒入油");
}
// 倒菜
public abstract void PourVegetables();
// 倒调料
public abstract void PourSeasoning();
// 翻炒
public final void StirFry(){
System.out.println("翻炒到菜熟");
}
// 起锅
public final void Boil(){
System.out.println("菜炒熟了,起锅!!");
}
public final void cook(){
PourOil();
PourVegetables();
PourSeasoning();
StirFry();
Boil();
}
}
package day726.a;
public class Cook extends AbstractCook{
@Override
public void PourVegetables() {
System.out.println("倒入白菜");
}
@Override
public void PourSeasoning() {
System.out.println("放点辣椒");
}
}
package day726.a;
public class Test {
public static void main(String[] args) {
AbstractCook cook=new Cook();
cook.cook();
}
}
在上述案例,炒菜的步骤是一样的,我不想打乱炒菜的步骤,我就用final关键字修饰,子类就不能重写,有些具体的操作不同,我用abstract关键字修饰,定义为抽象方法,由子类去实现。
注:在定义模板类中的方法时,需要慎用修饰词:final、abstract。final用来可以用来定义那些不想被子类重写的方法,abstract则可以用来定义那些需要子类去具体实现的方法。
通过使用模板方法模式,一方面提高了代码的复用性,另一方面还可以利用面向对象的多态性,在运行时选择一种具体子类,实现完整的模板方法,提高系统的灵活性和可扩展性。



