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


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

    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 类图
    enter description here

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

    • 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)实现了模板方法,模板方法又依赖于基本方法。

  • 相关阅读:
    常用的Dos命令
    关于CSS3
    数据渲染
    jQuery中的AJAX
    AJAX
    面向对象3
    克隆对象、对象继承
    面向对象2
    面向对象1
    面向对象
  • 原文地址:https://www.cnblogs.com/maying3010/p/6649170.html
Copyright © 2020-2023  润新知