前言
相信大家都写过各种各样的文档,需求文档、设计文档、使用手册等等。为了提高复用性和灵活度,需要采用一系列的模板来应对。
定义
定义一个操作中的算法框架,将一些步骤延迟到子类中,使子类不改变一个算法的结构即可重新定义算法的某些特定步骤
结构图
角色拆解分析:
1.AbstractClass:抽象类,定义了一套算法框架
2.ConcreteClass:具体实现类
举栗实现
封装固定的流程,第一步是什么,第二步是什么,这些都在抽象类中定义好。子类可以有不同的算法实现,在算法框架不被修改的前提下,实现某些步骤的算法的替换。这里还以迈腾举栗,迈腾的生产要安装发动机模块、中控模块、座椅模块…
1.创建AbstractClass抽象类,定义算法框架
public abstract class AbstractCar {
//final防止算法框架被重写
public final void magotan(){
//发动机模块
engine();
//中控模块
screen();
//省略其他模块...
}
protected abstract void engine();
protected abstract void screen();
}
2.ConcreteClass具体实现类
迈腾从乞丐版到顶配版,中间包含了多种配置类型,其中以230为代表的乞丐版只搭配了EA211发动机和一个小窄屏(德原朗乞丐版送一个大众原厂手机支架…),高配搭配了EA888发动机和德赛西威187b。虽然实现不同,但是模板都是一样的,往上一怼就装上了。
先看看乞丐版迈腾是什么配置的:
public class LowMagotan extends AbstractCar {
@Override
protected void engine() {
System.out.print("乞丐版迈腾装配了一台EA211的1.4T涡轮增压发动机");
}
@Override
protected void screen() {
System.out.print("乞丐版迈腾装配的屏幕太小了...");
}
}
再看看高配迈腾:
public class HighMagotan extends AbstractCar {
@Override
protected void engine() {
System.out.print("高配迈腾搭载了一台EA888发动机");
}
@Override
protected void screen() {
System.out.print("高配迈腾搭载了一块德赛西威187b的中控屏");
}
}
3.客户端调用
分别启动高配、低配迈腾的组装方法,安装发动机、中控等…
public class Client {
public static void main(String []args){
HighMagotan highMagotan = new HighMagotan();
highMagotan.magotan();
LowMagotan lowMagotan = new LowMagotan();
lowMagotan.magotan();
}
}
优缺点对比
优点:
1.把不变的方法移动到超类,去除了子类的重复代码
2.子类实现的某些细节,方便拓展
缺点:
1.每个实现都需要定义一个子类,会使类变得更多,设计越来越抽象
使用场景
1.多个子类有共有方法,并且逻辑基本相同
2.需要子类来决定父类中算法的某个步骤是否执行,实现子类对父类的反向控制
3.面对核心算法,可以将其设定为模板方法,周边功能由子类去实现