在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
优点
提取公共部分代码,便于维护
缺点
抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响父类的结果,也就是子类对父类产生了影响,在负责的项目中,会带来代码阅读的复杂性
有多个子类共有的方法,且逻辑相同。
重要的、复杂的方法,可以考虑作为模板方法。
AbstractClass(抽象类) :在抽象类中定义了一系列基本操作(Primitive Operations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以及完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
AbstractClass(抽象类)
public abstract class Dish {
/**
* 模板方法
*/
public void doDish(){
this.preparation();
this.doing();
this.carriedDishes();
}
/**
* 备料
*/
public abstract void preparation();
/**
* 做菜
*/
public abstract void doing();
/**
* 上菜
*/
public abstract void carriedDishes();
}
ConcreteClass(具体子类)
public class Builli extends Dish{
@Override
public void preparation() {
System.out.println("切猪肉和土豆");
}
@Override
public void doing() {
System.out.println("将切好的猪肉倒入锅中炒一会然后倒入土豆连炒带炖。");
}
@Override
public void carriedDishes() {
System.out.println("将做好的红烧肉盛进碗里端给客人吃。");
}
}
ConcreteClass(具体子类)
public class EggsWithTomato extends Dish{
@Override
public void preparation() {
System.out.println("洗并切西红柿,打鸡蛋");
}
@Override
public void doing() {
System.out.println("鸡蛋倒入锅中,然后倒入西红柿一起炒");
}
@Override
public void carriedDishes() {
System.out.println("将炒好的西红柿装入盘子,端给客人吃");
}
}
客户端
public class Client {
public static void main(String[] args) {
Dish eggWithTomato = new EggsWithTomato();
eggWithTomato.doDish();
Dish bouilli = new Builli();
bouilli.doDish();
}
}