zoukankan      html  css  js  c++  java
  • Spring中常见的设计模式——模板模式

    一、模板模式的应用场景

      模板模式又叫模板方法模式(Template Method Pattern),指定义一个算法的骨架,并允许自雷为一个或者多个步骤提供实现。模板模式使得子类可以在不改变算法结果的情况下,重新定义算法的某些步骤,属于行为型设计模式。模板模式适用于以下场景:

    • 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
    • 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。

      把东西装冰箱的步骤模板:

    public abstract class PutThingIntoFrigCourse {
    
        protected final void createCourse() {
            //是否需要对大块的东西进行切割
            if (needCut()) {
                this.cut();
            }
            //打开冰箱门
            this.openDoor();
            //把东西放进去
            this.putThingIntoFrig();
            //关闭冰箱门
            this.closeDoor();
        }
    
        //钩子方法:对步骤进行微调
        protected boolean needCut() {
            return false;
        }
    
        //钩子方法:就是通过返回值对模板类内部进行修改
        abstract String thing();
    
        final void cut() {
            System.out.println("切碎" + thing());
        }
    
        final void openDoor() {
            System.out.println("打开冰箱门");
        }
    
        final void putThingIntoFrig() {
            System.out.println("把" + thing() + "放冰箱");
        }
    
        final void closeDoor() {
            System.out.println("关闭冰箱门");
        }
    }

      这里面的钩子方法主要目的是干预执行流程,使得控制行为更加灵活,更符合实际业务需求,钩子方法通过返回值对主流程进行控制。

    二、模板模式在源码中的体现 

      JDBCTemplate看这个名字就知道了。再看JDK中的AbstractList类的代码:

    public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
        ...
        abstract public E get(int index); 
        ...
    }

      可以发现get()方法是一个抽象方法,交给子类实现,比如ArrayList就是AbstractList的子类。还有HttpServlet,有三个方法:service()、doGet()、doPost() 都是模板方法的抽象实现。

      在Mybatis框架中有一个BaseExecutor类,它是一个基础的sql执行类,实现了大部分SQL的执行逻辑,然后把几个方法交给子类定制化完成。

    三、模板模式的优缺点

      优点:

    • 利用模板模式将相同处理逻辑的代码放在抽象父类中,可以提高代码的复用性。
    • 将不同的代码放到不同的子类中,通过对子类的扩展增加新的行为,可以提高代码的扩展性。
    • 把不变的行为卸载父类中,除去子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。

      缺点:

    • 每个抽象类都需要一个子类实现,导致类的数量增加。
    • 类数量的增加间接的增加了系统复杂性。
    • 因为继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要改一遍。
  • 相关阅读:
    Xshell连接阿里云Centos6.8
    vsftpd文件服务器安装与配置
    JDK安装(linux系统)
    网站架构
    linux软件源配置
    java 调用静态方法和构造函数和静态块执行的先后顺序
    Mybatis的WHERE和IF动态
    MAVEN项目(仓库中没有jar包)
    Shiro
    MVC系列学习(六)-Razor语法
  • 原文地址:https://www.cnblogs.com/xcgShare/p/12170477.html
Copyright © 2011-2022 走看看