Skip to content

模板方法模式

一、介绍

模板方法模式Template Method是指定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤,属于行为型模式

二、应用场景

  • javaweb里面的Servlet,HttpService类提供了一个service()方法,
  • 有多个子类共有逻辑相同的方法,可以考虑作为模板方法
  • 设计一个系统时知道了算法所需的关键步骤,且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,可以延迟到子类进行完成

三、角色

  • 抽象模板(Abstract Template): 定义一个模板方法,这个模板方法一般是一个具体方法,给出一个顶级算法骨架,而逻辑骨架的组成步骤在相应的抽象操作中,推迟到子类实现
    • 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法
    • 基本方法:是整个算法中的一个步骤,包括抽象方法和具体方
      • 抽象方法:在抽象类中申明,由具体子类实现。
      • 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它
  • 具体模板(Concrete Template):实现父类所定义的一个或多个抽象方法,它们是一个顶级算法逻辑的组成步骤

四、优缺点

  • 优点
    • 扩展性好,对不变的代码进行封装,对可变的进行扩展,符合 开闭原则
    • 提高代码复用性 将相同部分的代码放在抽象的父类中,将不同的代码放入不同的子类中。通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制
  • 缺点
    • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,会使系统变得复杂

五、模板方法模式和建造者模式区别

两者很大的交集,建造者模式比模板方法模式多了一个指挥类,该类体现的是模板方法模式中抽象类的固定算法的功能,是一个创建对象的固定算法

六、代码

模板类

package com.lcy.study.design.template;

/**
 * @Description 项目管理抽象类
 * @Author lcy
 * @Date 2021/7/26 11:55
 */
public abstract class AbstractProjectManager {

    /**
     * 项目流程
     * @author lcy
     * @date 2021/7/26 11:56
     **/
    public final void processProject(){
        review();
        design();
        development();
        online();
    }

    /**
     * 需求评审
     * @author lcy
     * @date 2021/7/26 11:57
     **/
    public void review(){
        System.out.println("需求评审");
    }

    /**
     * 项目设计
     * @author lcy
     * @date 2021/7/26 11:57
     **/
    public void design(){
        System.out.println("项目设计");
    }

    /**
     * 开发
     * @author lcy
     * @date 2021/7/26 11:57
     **/
    public abstract void development();

    /**
     * 投产
     * @author lcy
     * @date 2021/7/26 11:57
     **/
    public abstract void online();

}

具体方法类

package com.lcy.study.design.template;

/**
 * @Description 支付项目管理
 * @Author lcy
 * @Date 2021/7/26 12:00
 */
public class PayProjectManager extends  AbstractProjectManager{

    @Override public void development(){
        System.out.println("开发支付");
    }

    @Override public void online(){
        System.out.println("支付功能上线");
    }
}
package com.lcy.study.design.template;

/**
 * @Description 用户管理
 * @Author lcy
 * @Date 2021/7/26 12:00
 */
public class UserProjectManager extends AbstractProjectManager {

    @Override public void development(){
        System.out.println("开发用户功能");
    }

    @Override public void online(){
        System.out.println("用户功能上线");
    }
}

执行类

package com.lcy.study.design.template;

/**
 * @Description 执行模板
 * @Author lcy
 * @Date 2021/7/26 12:02
 */
public class TemplateMain {

    public static void main(String[] args){

        AbstractProjectManager projectManager = new PayProjectManager();
        projectManager.processProject();
        projectManager = new UserProjectManager();
        projectManager.processProject();
        
    }
}