设计模式学习笔记(七、行为型-模板模式)

目录:

  • 什么是模板模式
  • 为什么要有模板模式
  • 模板模式的实现
  • 具体案例

什么是模板模式

在一个方法中定义算法骨架,并将骨架中的某些步骤推迟到子类实现

为什么要有模板模式

1、它可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤(具体实现)。

2、解决复用扩展问题

模板模式的实现

 1 /**
 2  * 模板模式代码骨架
 3  *
 4  * @author zhoude
 5  * @date 2020/4/18 10:28
 6  */
 7 public abstract class AbstractClass {
 8 
 9     /**
10      * 这就是模板模式的算法骨架
11      */
12     public final void templateMethod() {
13         // ......
14         method1();
15         // ......
16         method2();
17         // ......
18     }
19 
20     /**
21      * 算法骨架的具体步骤
22      */
23     protected abstract void method1();
24 
25     /**
26      * 算法骨架的具体步骤
27      */
28     protected abstract void method2();
29 }
 1 public class ConcreteClass1 extends AbstractClass {
 2 
 3     @Override
 4     protected void method1() {
 5 
 6     }
 7 
 8     @Override
 9     protected void method2() {
10 
11     }
12 }
 1 public class ConcreteClass2 extends AbstractClass {
 2 
 3     @Override
 4     protected void method1() {
 5 
 6     }
 7 
 8     @Override
 9     protected void method2() {
10 
11     }
12 }
 1 public class Test {
 2 
 3     public static void main(String[] args) {
 4         AbstractClass abstractClass = new ConcreteClass1();
 5         abstractClass.templateMethod();
 6 
 7         AbstractClass abstractClass2 = new ConcreteClass2();
 8         abstractClass2.templateMethod();
 9     }
10 }

具体案例

前面我们说到,模板模式可以解决复用扩展问题,这里我们通过几个案例来简述下。

1、复用:

如Java集合包中的AbstractList的addAll方法就定义了添加一个集合到list中的模板方法。

1 public boolean addAll(int index, Collection<? extends E> c) {
2     rangeCheckForAdd(index);
3     boolean modified = false;
4     for (E e : c) {
5         add(index++, e);
6         modified = true;
7     }
8     return modified;
9 }
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函数过程这里就不再阐述,有兴趣的小伙伴可以自行翻阅源码。

posted @ 2020-04-18 10:52  被猪附身的人  阅读(144)  评论(0编辑  收藏  举报