模板方法模式(Template)

news/2025/2/9 5:37:25 标签: 模板方法模式

一、模板方法的定义:

在操作中定义业务逻辑框架,包含业务逻辑的方法就是模板方法,模板方法允许子类在不改变原有业务逻辑的流程下,对某些步骤进行扩展和修改;

是一种基于继承的代码复用技术,是一种类行为模式(基于类的,继承关系的,也就是在模板方法模式中,只存在子类和父类的关系),通过继承来复用和扩展父类的功能;主要就是用来提高程序代码的复用性和扩展性的;

Template方法也可以理解为钩子函数和回调函数(hook);

二、UML

三、实现

1、抽象模板

package com.zhucl.templates;

/**
 * 案例:模拟把大象(或其他)装进冰箱
 * <p>
 * 抽象的模板类
 */
public abstract class AbstractTemplate {

    //冰箱门是否开启,默认关闭
    protected boolean doorIsOpen = false;

    void openFridgeDoor() {
        System.out.println("打开冰箱门~");
        doorIsOpen = true;
    }

    abstract void putSomethingOn(String key);

    void closedFridgeDoor() {
        System.out.println("关上冰箱门~");
        doorIsOpen = true;
    }

    void template(String something) {
        //开始进行把东西装进冰箱的动作,如果东西不为null,则打开冰箱门,把东西装进去,最后关闭冰箱门
        System.out.println("开始进行把东西装进冰箱的动作~");
        if (something != null) {
            openFridgeDoor();
            putSomethingOn(something);
        }
        if (!this.doorIsOpen) {
            closedFridgeDoor();
        }
        System.out.println("冰箱门是否开启:" + doorIsOpen);
    }

}

2、具体实现

package com.zhucl.templates;

/**
 * 把肉装进冰箱的具体实现
 */
public class ConcreteMeatsTemplate extends AbstractTemplate {
    @Override
    void putSomethingOn(String meats) {
        System.out.println("把肉装进冰箱~" + meats);
    }
}
package com.zhucl.templates;

public class ConcreteMilkTemplate extends AbstractTemplate {
    @Override
    void putSomethingOn(String key) {
        System.out.println("把奶装进冰箱~" + key);
    }
}
package com.zhucl.templates;

public class ConcreteEggsTemplate extends AbstractTemplate {
    @Override
    void putSomethingOn(String key) {
        System.out.println("把蛋装进冰箱~" + key);
    }
}

3、客户端调用

package com.zhucl.templates;

/**
 * 客户端调用
 */
public class TemplateClient {
    public static void main(String[] args) {
        AbstractTemplate t1 = new ConcreteMeatsTemplate();
        t1.template("菲力");
        System.out.println("t1的冰箱门是否关闭:" + t1.doorIsOpen);

        System.out.println("====================");

        AbstractTemplate t2 = new ConcreteMilkTemplate();
        t2.template("安佳牛奶");
        System.out.println("t2的冰箱门是否关闭:" + t2.doorIsOpen);

        System.out.println("====================");

        AbstractTemplate t3 = new ConcreteEggsTemplate();
        t3.putSomethingOn("可生食鸡蛋");
        System.out.println("t3的冰箱门是否关闭:" + t3.doorIsOpen);

    }
}


http://www.niftyadmin.cn/n/5845585.html

相关文章

Django开发入门 – 0.Django基本介绍

Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释&#xff1a; Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …

pytest.fixture

pytest.fixture 是 pytest 测试框架中的一个非常强大的功能,它允许你在测试函数运行前后执行一些设置或清理代码。以下是关于 pytest.fixture 的详细介绍: 一、定义与用途 pytest.fixture 是一个装饰器,用于标记一个函数为 fixture。Fixture 函数中的代码可以在测试函数运…

基于 AI 智能名片 2+1 链动模式 S2B2C 商城小程序的线下门店同城流量运营策略研究

摘要&#xff1a;本文聚焦于线下门店在利用同城流量售卖产品过程中面临的机遇与挑战&#xff0c;深入探讨如何借助 AI 智能名片 21 链动模式 S2B2C 商城小程序优化运营策略。通过分析该模式与线下门店基于抖音平台开展业务的结合点&#xff0c;为线下门店在抖音流量红利下实现人…

Node.js 应用性能测试:Autocannon 的使用与 Docker 集成

在上一篇文章中&#xff0c;我们探讨了如何通过 PM2 和 Docker 的结合来高效管理和部署 Node.js 应用。本文将进一步介绍如何通过 autocannon 这一强大的性能测试工具&#xff0c;评估和优化 Node.js 应用的性能表现。无论是 API 服务、Web 应用&#xff0c;还是微服务架构&…

基于yolov11的阿尔兹海默症严重程度检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的阿尔兹海默症严重程度检测系统是一种创新的医疗辅助工具&#xff0c;旨在通过先进的计算机视觉技术提高阿尔兹海默症的早期诊断和病情监测效率。阿尔兹海默症是一种渐进性的神经退行性疾病&#xff0c;通常表现为认知障碍、记忆丧失和语言障碍等症状…

部署open webui 调用ollama启动的deepseek

以下是 部署Open WebUI并调用Ollama的deepseek-70b模型 的详细步骤&#xff0c;重点讲解部署和配置过程&#xff1a; 一、部署 Open WebUI 1. 安装Docker&#xff08;如已安装可跳过&#xff09; # 自动安装Docker curl -fsSL https://get.docker.com | sh # 启动Docker服务 …

MyBatis-Plus与PageHelper的jsqlparser库冲突问题

背景介绍 在最近的一个项目中&#xff0c;我们决定将Spring Boot升级至3.x版本&#xff0c;并同时升级了MyBatis-Plus到最新版本&#xff08;3.5.7&#xff09;。然而&#xff0c;在完成这些升级之后&#xff0c;我们遇到了一个问题&#xff1a;分页插件PageHelper无法正常工作…

uniapp商城之购物车模块

文章目录 一、列表渲染二、删除单品1.封装删除API2.按钮绑定事件三、修改单品数量1.复用步进器组件2.属性和事件的绑定3.接口封装4.调用接口四、修改商品选中/全选1.单品选中绑定事件调用修改API2.计算全选状态3.绑定事件调用全选API并渲染单品选中状态五、底部结算信息1.计算选…