文章目录
介绍
描述
模板模式设计模式属于行为型模式,是指一个抽象类公开定义了执行它的方法的模板,它的子类可以按要求重写方法实现,但调用将以抽象类中定义的方式进行。(例如:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构的条件下,就可以重定义该算法的某些特定步骤)。
特点
优点:封装不变部分,扩展可变部分、提取公共代码、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加。
实现原理
行为由抽象类中控制,而到子类中去实现,当调用时,执行抽象类中的模板方法(一般都用final修饰,代表执行流程,将会调用其他方法,因此禁止子类重写)。
适用
-
有多个子类共有的方法,且逻辑相同。
-
重要的、复杂的方法,可以考虑作为模板方法。
-
检测代码运行时间性能。
模板模式
实现
第一步:制作雪糕,创建Ice抽象类,Cookie、Grape继承Ice并实现具体的加入配料操作。
public abstract class Ice {
// 模板方法, final修饰,不让子类去覆盖
public final void make(){
// 流程
butter();
mixture();
freezing();
}
// 奶酪制作
void butter(){
System.out.println("制作奶油 ....");
}
// 子类实现
abstract void mixture();
void freezing(){
System.out.println("放入冰箱 ....");
}
}
// 配料一 : 加入葡萄干
public class Grape extends Ice {
public Grape() {
}
@Override
void mixture() {
System.out.println("加入 葡萄干 ....");
}
}
// 配料一 : 加入饼干
public class Cookie extends Ice{
public Cookie() {
}
@Override
void mixture() {
System.out.println("加入 饼干 ....");
}
}
第二步:测试。
public class Test {
public static void main(String[] args) {
System.out.println(" = 制作 葡萄干 雪糕 = ");
Ice grapeIce = new Grape();
grapeIce.make();
System.out.println(" = 制作 饼干 雪糕 = ");
Ice cookieIce = new Cookie();
cookieIce.make();
/*
= 制作 葡萄干 雪糕 =
制作奶油 ....
加入 葡萄干 ....
放入冰箱 ....
= 制作 饼干 雪糕 =
制作奶油 ....
加入 饼干 ....
放入冰箱 ....
*/
}
}
当我们并不不想加入任何配料该怎么操作呢?可以直接创建子类对mixture()进行空实现,或者在抽象类中使用钩子方法,子类继承对mixture()进行空实现,同时重写wantMixture()。
// 抽象类
public abstract class Ice {
// 模板方法, final修饰,不让子类去覆盖
public final void make(){
// 流程
butter();
// 钩子方法 .. 进行改动;
if (wantMixture()){
mixture();
}
freezing();
}
// 奶酪制作
void butter(){
System.out.println("制作奶油 ....");
}
// 子类实现
abstract void mixture();
void freezing(){
System.out.println("放入冰箱 ....");
}
// 钩子方法 默认需要配料
boolean wantMixture(){
return true; // 默认返回 true 子类可以通过重写 来操作流程
}
}
// 配料: 不加
public class Milk extends Ice{
@Override
void mixture() {
// 先对其 空实现
}
// 不加配料
@Override
boolean wantMixture() {
return false;
}
}
// 测试
public class Test {
public static void main(String[] args) {
System.out.println(" = 制作 雪糕 = ");
Ice milkIce = new Milk();
milkIce.make();
/*
制作 雪糕 =
制作奶油 ....
放入冰箱 ....
*/
}
}