模板方法模式(Template)

一、模板方法的定义:

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

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

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

二、UML

三、实现

1、抽象模板

java 复制代码
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、具体实现

java 复制代码
package com.zhucl.templates;

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

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

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

3、客户端调用

java 复制代码
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);

    }
}
相关推荐
此木|西贝6 小时前
【设计模式】模板方法模式
java·设计模式·模板方法模式
coderzpw2 天前
当模板方法模式遇上工厂模式:一道优雅的烹饪架构设计
java·模板方法模式
〆、风神3 天前
装饰器模式与模板方法模式实现MyBatis-Plus QueryWrapper 扩展
mybatis·装饰器模式·模板方法模式
木子庆五6 天前
Android设计模式之模板方法模式
android·设计模式·模板方法模式
Hanson Huang8 天前
23种设计模式-模板方法(Template Method)设计模式
java·设计模式·模板方法模式·行为型设计模式
灏瀚星空12 天前
从指令集鸿沟到硬件抽象:AI 如何重塑手机与电脑编程语言差异——PanLang 原型全栈设计方案与实验性探索1
开发语言·人工智能·机器学习·语言模型·智能手机·架构·模板方法模式
灏瀚星空12 天前
运行时智控:PanLang 开发者指南(一)运行时系统核心模块实现——PanLang 原型全栈设计方案与实验性探索5
开发语言·人工智能·经验分享·后端·重构·模板方法模式·源代码管理
Antonio91518 天前
【Q&A】模板方法模式在Qt中有哪些应用?
qt·模板方法模式
小王子102422 天前
设计模式Python版 模板方法模式(下)
python·设计模式·模板方法模式
JuicyActiveGilbert22 天前
【C++设计模式】第二十一篇:模板方法模式(Template Method)
c++·设计模式·模板方法模式