13.(行为型模式)java设计模式之模板模式
一、什么是模板模式
定义⼀个操作中的算法⻣架,将算法的⼀些步骤延迟到⼦类中,使得⼦类可以不改变该算法结构的情况下重定义该算法的某些特定步骤,属于⾏为型模式
二、模板模式的实现方式
模式结构分析:
- 抽象模板(Abstract Template):定义一个模板方法,这个模板方法一般是一个具体方法,给出一个顶级算法骨架,而逻辑骨架的组成步骤在相应的抽象操作中,推迟到子类实现。
- 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
- 基本方法:是整个算法中的一个步骤,包括抽象方法和具体方。
- 抽象方法:在抽象类中申明,由具体子类实现。|具体方法︰在抽象类中已经实现,在具体子类中可以继承或重写它。
- 具体模板(Concrete Template):实现父类所定义的一个或多个抽象方法,它们是一个顶级算法逻辑的组成步骤。
-
具体模板(Concrete Template):实现⽗类所定义的⼀个或多个抽象⽅法,它们是⼀个顶级算法逻辑的组成步骤。
类关系图:
统一模型:
代码实现:
查看代码
/*
* 凭证模板的抽象类
* */
public abstract class VoucherAbstractClass {
/**
* 模版⽅法
*/
public void templateMethod() {
specificMethod();
buildVoucherHeader();
buildVoucherBody();
}
/**
* 具体⽅法
*/
public void specificMethod() {
System.out.println("抽象类中的具体⽅法被调⽤");
}
// 抽象⽅法1
public abstract void buildVoucherHeader();
// 抽象⽅法2
public abstract void buildVoucherBody();
}
/*
* 收入凭证
* */
public class IncomeVoucher extends VoucherAbstractClass{
@Override
public void buildVoucherHeader() {
System.out.println("这个是收入的头");
}
@Override
public void buildVoucherBody() {
System.out.println("这个是收入的身体");
}
}
/*
* 成本凭证
* */
public class CostVoucher extends VoucherAbstractClass{
@Override
public void buildVoucherHeader() {
System.out.println("这个是成本的头");
}
@Override
public void buildVoucherBody() {
System.out.println("这个是成本的身体");
}
}
测试用例:
/*
*模板模式
* */
@Test
public void templateVoucher(){
VoucherAbstractClass incomeVoucher=new IncomeVoucher();
incomeVoucher.templateMethod();
VoucherAbstractClass costVoucher=new CostVoucher();
costVoucher.templateMethod();
}
测试结果:
抽象类中的具体⽅法被调⽤
这个是收入的头
这个是收入的身体
抽象类中的具体⽅法被调⽤
这个是成本的头
这个是成本的身体
方法评估:
模板方法模式和建造者模式区别:
两者很大的交集,建造者模式比模板方法模式多了一个指挥类,该类体现的是模板方法模式中抽象类的固定算法的功能,是一个创建对象的固定算法。
优点:
- 扩展性好,对不变的代码进⾏封装,对可变的进⾏扩展,符合开闭原则。
- 提⾼代码复⽤性将相同部分的代码放在抽象的⽗类中,将不同的代码放⼊不同的⼦类中。
- 通过⼀个⽗类调⽤其⼦类的操作,通过对⼦类的具体实现扩展不同的⾏为,实现了反向控制。
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,会使系统变得复杂。