首页 > 代码库 > 设计模式--模板方法模式

设计模式--模板方法模式

设计模式--模板方法模式

1 概述


1.1 定义
模板方法模式(Template Method Design)定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以在不改变算法结构的情况下,重新定义算法的某些特定步骤。

1.2 应用
JDK中InputStream中的read(byte b[], int off, int len)方法就依赖于read()方法,而read()方法就是InputStream子类实现。
还有许多类似的模板方法模式。之前自己学了1个月左右的Android,在学了过程中就发现Android中基本上都是继承,当时不是很懂,现在看来其大部分就是使用了类似模板方法模式,使得我们仅仅需要修改我们想要的代码就能够运行。如:我们自己写的Activity,我们仅仅重写我们想要的方法(如:onCreate()让它在启动时做一些事情),然后在Mainfest中注册就能够启动,具体怎么启动、怎么销毁都由模板Activity类实现。

1.3 类图
技术分享

模板方法模式涉及的角色如下:

  • AbstractClass抽象模板角色:由模板方法与基本方法构成。模板方法(一般为final,不希望子类重写)就是该算法的框架,该框架需要实现对基本方法的调用,完成固定的逻辑。
  • ConcreteClass具体角色:实现基本方法,已完成模板角色定义的模板方法。

2 详解

 1 public abstract class AbstractClass {
 2     // 基本的方法(子类实现)
 3     protected abstract void primitiveOperation1();
 4     protected abstract void primitiveOperation2();
 5 
 6     // 模板方法(调用基本方法完成算法)
 7     public final void templateMethod(){
 8         /**
 9          * 调用基本方法,完成相关逻辑
10          */
11         primitiveOperation1();
12         primitiveOperation2();
13     }
14 }
15 
16 public class ConcreteClass1 extends AbstractClass {
17     @Override
18     protected void primitiveOperation1() {
19         System.out.println("ConcreteClass1.primitiveOperation1");
20     }
21 
22     @Override
23     protected void primitiveOperation2() {
24         System.out.println("ConcreteClass1.primitiveOperation2");
25     }
26 }
27 
28 public class Client {
29     public static void main(String[] args) {
30         AbstractClass class1 = new ConcreteClass1();
31         // 调用模板方法,完成相关逻辑
32         class1.templateMethod();
33     }
34 }output:
35 ConcreteClass1.primitiveOperation1
36 ConcreteClass1.primitiveOperation2

小结一下
模板方法模式用的特别的广泛,基本上在哪里都能看到。它让我们的在代码在可扩展性与一致性有了良好的是实现。
模板方法模式有许多的变形,如Android中绝大部分我们仅仅是需要继承相关类,修改一些方法就能够实现我们想要的结果。
之前我在看集合类时,发现其定义了需要的接口(如List接口),还有需要的抽象类(如AbstractList),然后具体的集合类都继承了该接口(如ArrayList)。现在看来,抽象类(如AbstractList)实现了模板方法,模板方法又依赖于基本方法。

设计模式--模板方法模式