模板方法模式

一、定义

1、定义

定义一个操作中算法的框架,将一些步骤延迟到子类中。使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤。

2、模板方法模式涉及到的角色

(1)抽象模板角色:定义一个或多个抽象操作,以便于让子类实现;还需要定义几个模板方法,实现对基本方法的调度;

(2)具体模板角色:实现抽象模板定义的一个或多个抽象方法,每个抽象模板角色可以有任意多个具体模板与之对应,每个具体模板角色可以给出这些抽象方法的不同实现,使得顶级逻辑的实现各不相同;

二、类图

三、代码实现

1、抽象模板角色

java 复制代码
package com.xiaobai.design_pattern.templatemethod;

/**
 * @author wangtw
 * @date 2023/11/29 21:44
 * @description 模板方法模式-抽象模板角色
 */
public abstract class AbstractClass {

    // 基本方法
    protected abstract void operation();

    // 公共方法
    protected void shareMethod() {
        System.out.println("这是公共操作");
    };

    // 模板方法
    public void templateMethod() {
        this.shareMethod();
        this.operation();
    }
}

2、具体模板角色1

java 复制代码
package com.xiaobai.design_pattern.templatemethod;

/**
 * @author wangtw
 * @date 2023/11/29 21:50
 * @description 模板方法模式-具体模板角色1
 */
public class ConcreteOneClass extends AbstractClass{

    @Override
    protected void operation() {
        System.out.println("具体操作1");
    }
}

3、具体模板角色2

java 复制代码
package com.xiaobai.design_pattern.templatemethod;

/**
 * @author wangtw
 * @date 2023/11/29 21:52
 * @description 模板方法模式-具体模板角色2
 */
public class ConcreteTwoClass extends AbstractClass{

    @Override
    protected void operation() {
        System.out.println("具体操作2");
    }
}

4、测试类

java 复制代码
package com.xiaobai.design_pattern.templatemethod;

import org.junit.jupiter.api.Test;

/**
 * @author wangtw
 * @date 2023/11/29 21:53
 * @description 模板方法模式测试类
 */
public class TemplateMethodTest {

    @Test
    public void test() {
        AbstractClass acOne = new ConcreteOneClass();
        acOne.templateMethod();

        AbstractClass acTwo = new ConcreteTwoClass();
        acTwo.templateMethod();
    }
}

四、总结

1、模板方法模式的优点

(1)封装不变的部分,扩展可变部分。不变的部分封装到父类中实现,而可变的部门则可以通过继承进行扩展;

(2)提取公共代码,便于维护;

(3)行为由父类控制,子类实现,子类可以通过扩展增加相应的功能,符合开闭原则;

相关推荐
mldong1 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
tqs_123452 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
逆境不可逃2 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
浪子明X2 小时前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言
Flynt3 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet3 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
星云API技术支持3 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
niucloud-admin4 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
海宇AI5 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化
xiangyun615 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法