设计模式(七、行为型-模板模式)
目录:
- 什么是模板模式
- 为什么要有模板模式
- 模板模式的实现
- 具体案例
什么是模板模式
在一个方法中定义算法骨架,并将骨架中的某些步骤推迟到子类实现。
为什么要有模板模式
1、它可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤(具体实现)。
2、解决复用和扩展问题
模板模式的实现
/** * 模板模式代码骨架 * * @author zhoude * @date 2020/4/18 10:28 */ public abstract class AbstractClass { /** * 这就是模板模式的算法骨架 */ public final void templateMethod() { // ...... method1(); // ...... method2(); // ...... } /** * 算法骨架的具体步骤 */ protected abstract void method1(); /** * 算法骨架的具体步骤 */ protected abstract void method2(); }
public class ConcreteClass1 extends AbstractClass { @Override protected void method1() { } @Override protected void method2() { } }
public class ConcreteClass2 extends AbstractClass { @Override protected void method1() { } @Override protected void method2() { } }
public class Test { public static void main(String[] args) { AbstractClass abstractClass = new ConcreteClass1(); abstractClass.templateMethod(); AbstractClass abstractClass2 = new ConcreteClass2(); abstractClass2.templateMethod(); } }
具体案例
前面我们说到,模板模式可以解决复用和扩展问题,这里我们通过几个案例来简述下。
1、复用:
如Java集合包中的AbstractList的addAll方法就定义了添加一个集合到list中的模板方法。
public boolean addAll(int index, Collection<? extends E> c) { rangeCheckForAdd(index); boolean modified = false; for (E e : c) { add(index++, e); modified = true; } return modified; }
1 public void add(int index, E element) { 2 throw new UnsupportedOperationException(); 3 }
虽然他的模板方法没有和上述骨架一样定义成final,但正是这样,子类也可以重写定义addAll的算法骨架。
add方法也没有定义成abstract,而是通过抛出异常的方式,其实这都是一样的,都符合模板模式的思想。
———————————————————————————————————————————————————————
2、扩展:
如servlet,我们知道需要实现一个servlet只要继承HttpServlet,并实现doGet和doPost方法就可以了。
而这里的doGet和doPost正是servlet算法骨架的扩展点,让客户端自行定义具体的请求执行逻辑。
因servlet的service函数过程这里就不再阐述,有兴趣的小伙伴可以自行翻阅源码。