设计模式3-模板方法模式

定义

Template Method Partern:定义一个操作中的算法的框架(就是步骤),而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

通俗理解:父类规定流程,子类去做实现。

目的

● 代码复用

● 定义规范和约束

● 模板方法模式不仅仅是一种"复用代码"的技巧,更是一种定义框架、规范行为、实现松耦合的重要设计思想

场景

● 营业厅办理业务:取号=》办理业务=》柜台评价、每个人办理的业务不同可能是办卡、可能是转卡、转套餐、办宽带。

● 手机组装:装机的流程是固定的,装内部主板=》装电池=》装外壳=》测试手机

● 业务分摊:总公司的费用需要分摊到各个子公司

代码

java 复制代码
// 模板方式方法-父类规定子类的行为
// 以营业厅办理业务:取号=》办理业务=》柜台评价为例
/**
 * 抽象模板类 - 定义业务办理流程的骨架
 */
abstract class BusinessProcess {

    // 模板方法:定义了办理业务的固定流程。final防止子类重写整个流程。
    public final void handle() {
        takeNumber(); // 1. 取号 (固定步骤)
        processBusiness(); // 2. 办理业务 (抽象步骤,由子类实现)
        giveFeedback(); // 3. 评价 (固定步骤)
    }

    // 固定步骤1:取号
    private void takeNumber() {
        System.out.println(">>> 客户您好,请取号排队... [号码:A" + (int)(Math.random() * 100) + "]");
    }

    // 抽象方法:办理业务。留给子类去实现具体的业务逻辑。
    protected abstract void processBusiness();

    // 固定步骤3:评价
    private void giveFeedback() {
        System.out.println(">>> 业务办理完毕,请对我的服务做出评价(1-5星)。谢谢!");
        System.out.println("----------------------------------------");
    }
}

/**
 * 具体子类 - 办理手机卡业务
 */
class OpenCardBusiness extends BusinessProcess {
    @Override
    protected void processBusiness() {
        // 实现办理手机卡的特有逻辑
        System.out.println(">>> 【核心业务】正在为您办理手机卡:");
        System.out.println("    - 验证身份证信息");
        System.out.println("    - 选择手机号码");
        System.out.println("    - 录入个人信息");
        System.out.println("    - 成功激活SIM卡");
    }
}

/**
 * 具体子类 - 缴纳话费业务
 */
class PayBillBusiness extends BusinessProcess {
    @Override
    protected void processBusiness() {
        // 实现缴纳话费的特有逻辑
        System.out.println(">>> 【核心业务】正在为您缴纳话费:");
        System.out.println("    - 查询手机号码欠费金额");
        System.out.println("    - 接收客户付款");
        System.out.println("    - 系统充值到账");
        System.out.println("    - 打印缴费凭证");
    }
}

/**
 * 客户端/测试类
 */
class ClientTest {
    public static void main(String[] args) {
        System.out.println("===== 第一位客户:办理手机卡 =====");
        BusinessProcess openCard = new OpenCardBusiness();
        openCard.handle(); // 调用模板方法,开始固定流程

        System.out.println("===== 第二位客户:缴纳话费 =====");
        BusinessProcess payBill = new PayBillBusiness();
        payBill.handle(); // 调用模板方法,开始固定流程

        // 未来新增业务,比如"办理宽带",只需要再创建一个子类即可,无需修改现有流程。
    }
}

模板方式方法代码

相关推荐
To_OC9 小时前
从一行入口代码啃透 NestJS:工厂模式、装饰器和依赖注入是怎么串起来的
后端·设计模式·nestjs
东方小月11 小时前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
程序员贺加贝13 小时前
轻制造SaaS的生产闭环建模-BOM工单领料报工质检与入库
java·设计模式·架构
嘟嘟071715 小时前
SDD 规范驱动开发:从 vibe coding 崩盘到"两次创造"
设计模式·代码规范·vibecoding
无凭16 小时前
拆解 DeerFlow Memory:Agent 的长期记忆到底怎么做?
人工智能·设计模式
AI大法师19 小时前
品牌焕新不只换 Logo:捷豹案例里的触点重构方法
大数据·人工智能·设计模式·新媒体运营
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-23-桥接模式(源码剖析篇)
java·设计模式·jdbc·桥接模式·源码分析·awt·java logging
嘟嘟07172 天前
TypeScript 工具类型通关:Pick、Omit、Partial、Record 区别与 Omit 等价实现一次讲清
设计模式·面试·typescript
SL_staff2 天前
中小离散制造如何用工艺路线模板解决‘人走流程丢’——JVS-APS 实践解析
java·设计模式·全栈
Asize2 天前
3 种设计模式 + DI:Nest.js 后端第一课
后端·设计模式·nestjs