zoukankan      html  css  js  c++  java
  • 设计模式学习笔记(七、行为型-模板模式)

    目录:

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

    什么是模板模式

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

    为什么要有模板模式

    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函数过程这里就不再阐述,有兴趣的小伙伴可以自行翻阅源码。

  • 相关阅读:
    吴恩达机器学习笔记 —— 19 应用举例:照片OCR(光学字符识别)
    吴恩达机器学习笔记 —— 17 推荐系统
    吴恩达机器学习笔记 —— 13 支持向量机
    吴恩达机器学习笔记 —— 15 降维
    SAP MM 无价值物料管理的一种实现思路
    第一节 电商
    e3mall_day09
    activemq整合spring的配置
    log4j简介
    ActiveMQ的入门使用
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/12724465.html
Copyright © 2011-2022 走看看