1.什么是模板设计模式:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2.什么时候使用模板设计模式:
当有些通用的步骤,但是实现方式不太一样的时候我们可以使用模板设计模式。
例如炒菜,我们都是先放油,然后放葱姜蒜,然后再放主菜,然后翻炒出锅
3.模板设计模式的优缺点:
优点:1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
4.模板设计模式的实现:
我们以炒菜为例,定义一个抽象的框架类,把具体的步骤给实现,有差异的地方让子类去实现。模板方法一定是final的,防止子类修改
public abstract class Cook {
//final防止子类复写修改逻辑,如果子类把开火的逻辑去掉,这个菜怎么也炒不熟了。
public final void cook() {
openFire();
pourOil();
putIngredients();
stirFry();
complete();
}
//开火
private void openFire() {
System.out.println("开火");
}
//先倒油
protected void pourOil() {
System.out.println("锅里倒上油");
}
private void stirFry() {
System.out.println("翻炒");
}
//放入什么食材由子类去决定
protected abstract void putIngredients();
private void complete() {
System.out.println("做完出锅");
}
}
西蓝花
/**
* 比如我们炒个西蓝花
*/
public class BroccoliCook extends Cook {
@Override
protected void putIngredients() {
System.out.println("放入盐、鸡精");
System.out.println("放入西蓝花");
}
}
辣子鸡丁
public class SpicyChickenCook extends Cook {
@Override
protected void putIngredients() {
System.out.println("放入辣椒");
System.out.println("放入鸡丁");
}
}
测试代码
public class Main {
public static void main(String[] args) {
SpicyChickenCook spicyChickenCook = new SpicyChickenCook();
spicyChickenCook.cook();
BroccoliCook broccoliCook = new BroccoliCook();
broccoliCook.cook();
}
输出
开火
锅里倒上油
放入辣椒
放入鸡丁
翻炒蔬菜
做完出锅
开火
锅里倒上油
放入盐、鸡精
放入西蓝花
翻炒蔬菜
做完出锅
网友评论