常用设计模式系列(十四)—模板方法模式

发布于:2025-07-29 ⋅ 阅读:(23) ⋅ 点赞:(0)

常用设计模式系列(十四)—模板方法模式

第一节

前言

之前我完成了创建型设计模式和结构型设计模式,我们今天将踏入设计模式的第三章:行为型设计模式,你是否还记得什么是行为型设计模式吗?行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。今天开始讲解第一篇,模板方法模式,所谓模板,就是定义相同的模板规范,去构建固定行为与可扩展行为,每个可扩展行行为可以有自己的特点。

第二节

模板方法模式

模板方法模式(Template
Method):一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

个人理解(Person
Understand):抽象类可以定义一些普通方法及抽象方法,普通方法按照自己的规范进行定义即定义流程,但是流程中的每个步骤都可以在子节点进行特例化处理,在上层定义规范,在下层在规范的基础上进行特殊化处理。

模板方法模式构成:

在这里插入图片描述

在这里插入图片描述

小杨同学入职后,需要去银行办理一张工资卡,来到银行后,银行提供了两种办卡方式,第一为人工办理、第二种为机器自助办理,可根据自己的选择完成办卡。办卡流程为:填写个人身份信息、人像识别、密码设置、签名留存。使用机器和人工都可以完成卡的办理。银行所定义的开卡流程就是我们模板方法模式中的,抽象模板类用来定义流程,那么人工办卡和机器自主办卡则是两种具体实现类。

在这里插入图片描述

image

第三节

代码实现

1.编写抽象模板类

package com.yang.templatemethod;


/**
 * @ClassName AbstractOpenCar
 * @Description 抽象模板类-开卡
 * @Author IT小白架构师之路
 * @Date 2021/1/5
 * @Version 1.0
 **/
public abstract class AbstractOpenCar {
    //开卡
    public void  openCar(String password){
        writeInfo();
        faceDistinguish();
        givePass(password);
        autograph();
    }


    /**
     * 填写个人信息
     */
    public abstract void writeInfo();


    /**
     * 人脸识别
     */
    public void faceDistinguish(){
        System.out.println("识别人脸:人脸识别系统");
    }
    //设置密码
    public void givePass(String password){
        System.out.println("设置密码:密码设置为"+password);
    }
    //签名
    public abstract void autograph();


}

2.编写具体子类A

package com.yang.templatemethod;


/**
 * @ClassName ArtificialOpen
 * @Description 人工开卡
 * @Author IT小白架构师之路
 * @Date 2021/1/5
 * @Version 1.0
 **/
public class ArtificialOpen extends AbstractOpenCar{


    @Override
    public void writeInfo() {
        System.out.println("信息填写:提供个人信息,银行业务人员帮忙录入");
    }


    @Override
    public void autograph() {
        System.out.println("签名确认:纸质签名确认");
    }
}

3.编写具体子类B

package com.yang.templatemethod;


/**
 * @ClassName AutonomyOpen
 * @Description 机器自助开卡
 * @Author IT小白架构师之路
 * @Date 2021/1/5
 * @Version 1.0
 **/
public class AutonomyOpen extends AbstractOpenCar{
    @Override
    public void writeInfo() {
        System.out.println("信息填写:机器手动填写个人信息");
    }


    @Override
    public void autograph() {
        System.out.println("签名确认:电子签名确认");
    }
}

4.测试客户端

package com.yang.templatemethod;


/**
 * @ClassName Client
 * @Description 客户端测试
 * @Author IT小白架构师之路
 * @Date 2021/1/5
 * @Version 1.0
 **/
public class Client {
    public static void main(String[] args) {
        AbstractOpenCar openCar = new ArtificialOpen();
        System.out.println("选择人工开卡-----------");
        openCar.openCar("123789");
        System.out.println("结束人工开卡-----------");
        openCar = new AutonomyOpen();
        System.out.println();
        System.out.println("选择自助开卡-----------");
        openCar.openCar("147258");
        System.out.println("结束自助开卡-----------");
    }
}

5.程序运行结果如下,程序使用银行两种开卡方式完成了模板方法模式

选择人工开卡-----------
信息填写:提供个人信息,银行业务人员帮忙录入
识别人脸:人脸识别系统
设置密码:密码设置为123789
签名确认:纸质签名确认
结束人工开卡-----------


选择自助开卡-----------
信息填写:机器手动填写个人信息
识别人脸:人脸识别系统
设置密码:密码设置为147258
签名确认:电子签名确认
结束自助开卡-----------

第四节

优缺点及适用场景
优点

1.模板模式既定义了固定的流程,又支持了扩展功能,将固定的不可修改的在父类定义,子类去实现扩展的功能。

2.父类提供的公共方法,也便于代码复用

3.扩展的方法,父类不实现,交给了子类,子类可以通过继承的方式增加功能,符合了设计模式中的开闭原则。

缺点

1.如果要定义不同的实现,则需要创建新的实现类,业务增多时会增加类的数量,增加了系统的复杂性。

2.因为是通过继承实现的,如果父类增加新的流程规范(抽象方法),所有的子类都要修改源码来实现。

适用场景

1.当需要一个父类定义流程规范,但需要子类去实现的算法,父类负责不变的模块,子类负责扩展的模块时。

2.需要控制子类的扩展时(定义规范)。

3.需要将多个子类中的公共模块抽象提取出来到父类,解决代码冗余时。

4.例如我们JavaWeb开发过程中使用的servlet、filter都是使用了模板方法。

扫描二维码

关注我吧

IT小白架构师之路

image


网站公告

今日签到

点亮在社区的每一天
去签到