Spring中常见的设计模式——模板模式
⼀、模板模式的应⽤场景
  模板模式⼜叫模板⽅法模式(Template Method Pattern),指定义⼀个算法的⾻架,并允许⾃雷为⼀个或者多个步骤提供实现。模板模式使得⼦类可以在不改变算法结果的情况下,重新定义算法的某些步骤,属于⾏为型设计模式。模板模式适⽤于以下场景:
⼀次性实现⼀个算法的不变部分,并将可变的⾏为留给⼦类来实现。
各⼦类中公共的⾏为被提取出来并集中到⼀个公共的⽗类中,从⽽避免代码重复。
  把东西装冰箱的步骤模板:
public abstract class PutThingIntoFrigCourse {
protected final void createCourse() {
//是否需要对⼤块的东西进⾏切割
if (needCut()) {
this.cut();
}
//打开冰箱门
this.openDoor();
//把东西放进去
this.putThingIntoFrig();
//关闭冰箱门
this.closeDoor();
}
//钩⼦⽅法:对步骤进⾏微调
protected boolean needCut() {
return false;
}
//钩⼦⽅法:就是通过返回值对模板类内部进⾏修改
abstract String thing();
final void cut() {
System.out.println("切碎" + thing());
}
final void openDoor() {
System.out.println("打开冰箱门");
}
final void putThingIntoFrig() {
System.out.println("把" + thing() + "放冰箱");
}
final void closeDoor() {
System.out.println("关闭冰箱门");
}
}
  这⾥⾯的钩⼦⽅法主要⽬的是⼲预执⾏流程,使得控制⾏为更加灵活,更符合实际业务需求,钩⼦⽅法通过返回值对主流程进⾏控制。⼆、模板模式在源码中的体现 
  JDBCTemplate看这个名字就知道了。再看JDK中的AbstractList类的代码:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
...
abstract public E get(int index);
...
}
  可以发现get()⽅法是⼀个抽象⽅法,交给⼦类实现,⽐如ArrayList就是AbstractList的⼦类。还有HttpServlet,有三个⽅法:service()、doGet()、doPost() 都是模板⽅法的抽象实现。
  在Mybatis框架中有⼀个BaseExecutor类,它是⼀个基础的sql执⾏类,实现了⼤部分SQL的执⾏逻辑,然后把⼏个⽅法交给⼦类定制化完成。
三、模板模式的优缺点
  优点:
利⽤模板模式将相同处理逻辑的代码放在抽象⽗类中,可以提⾼代码的复⽤性。
将不同的代码放到不同的⼦类中,通过对⼦类的扩展增加新的⾏为,可以提⾼代码的扩展性。
spring framework表达式assign把不变的⾏为卸载⽗类中,除去⼦类的重复代码,提供了⼀个很好的代码复⽤平台,符合开闭原则。  缺点:
每个抽象类都需要⼀个⼦类实现,导致类的数量增加。
类数量的增加间接的增加了系统复杂性。
因为继承关系⾃⾝的缺点,如果⽗类添加新的抽象⽅法,所有⼦类都要改⼀遍。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。