23种设计模式——模板模式

简介: 模板模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术。
今天我们来学习23种设计模式中的模板模式。模板模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术。
概念:

模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

特点:

优点:

  1. 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
  2. 它在父类中提取了公共的部分代码,便于代码复用。
  3. 部分方法是由子类实现的,因此子类可以通过扩展方法增加相应的功能,符合开闭原则。

缺点:

  1. 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
  2. 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
类图分析:

模版模式类图.png

代码:

抽象类,豆浆

package cn.ppdxzz.template;

/**
 * description:抽象类,豆浆
 * @author: PeiChen JavaAnything
 */
public abstract class BaseSoyMilk {
    /**
     * 模板方法,修饰符设置成 final,不允许子类覆盖
     */
    final void make() {
        select();
        addCondiments();
        soak();
        beat();
    }

    /**
     * 1. 挑选材料
     */
    void select() {
        System.out.println("第一步:挑选新鲜的食材黄豆...");
    }

    /**
     * 2. 抽象方法,添加不同的食材,子类具体实现
     */
    abstract void addCondiments();

    /**
     * 3. 浸泡食材
     */
    void soak() {
        System.out.println("第三步:黄豆和配料开始浸泡...");
    }

    /**
     * 4. 打碎食材
     */
    void beat() {
        System.out.println("第四步:黄豆和配料放豆浆机里打碎。");
    }
}

红豆牛奶

package cn.ppdxzz.template;

/**
 * description:红豆牛奶
 * @author: PeiChen JavaAnything
 */
public class RedBeanSoyMilk extends BaseSoyMilk {
    @Override
    void addCondiments() {
        System.out.println("第二步:加入红豆...");
    }
}

花生牛奶

package cn.ppdxzz.template;

/**
 * description:花生牛奶
 * @author: PeiChen JavaAnything
 */
public class PeanutSoyMilk extends BaseSoyMilk {
    @Override
    void addCondiments() {
        System.out.println("第二步:加入花生...");
    }
}

模板模式客户端

package cn.ppdxzz.template;

/**
 * description:模板模式客户端
 * @author: PeiChen JavaAnything
 */
public class Client {
    public static void main(String[] args) {
        System.out.println("---制作红豆豆浆---");
        BaseSoyMilk redBeanSoyMilk = new RedBeanSoyMilk();
        redBeanSoyMilk.make();
        System.out.println("---制作花生豆浆---");
        BaseSoyMilk peanutSoyMilk = new PeanutSoyMilk();
        peanutSoyMilk.make();
    }
}

运行结果:

模版模式运行结果.png

总结:
  1. 有多个子类共有的方法,且逻辑相同时,可以考虑使用模板模式。
  2. 重要的、复杂的方法,可以考虑作为模板方法。
  3. 为防止恶意操作,一般模板方法都加上 final 关键词。
Spring 的 IoC 容器在初始化时就是用到了模板模式,需要深入了解的同学可以剖析下源码,自己研究一下。
目录
相关文章
|
6天前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
1月前
|
设计模式
设计模式-单一职责模式
设计模式-单一职责模式
|
1月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
1月前
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
|
1月前
|
设计模式 uml C语言
设计模式----------工厂模式之简单工厂模式(创建型)
这篇文章详细介绍了简单工厂模式,包括其定义、应用场景、UML类图、通用代码实现、运行结果、实际应用例子,以及如何通过反射机制实现对象创建,从而提高代码的扩展性和维护性。
设计模式----------工厂模式之简单工厂模式(创建型)
|
1月前
|
设计模式 uml
设计模式-------------工厂模式之工厂方法模式(创建型)
工厂方法模式是一种创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现类的实例化推迟到子类中进行,提高了系统的灵活性和可扩展性。
|
1月前
|
设计模式 测试技术 Go
[设计模式]创建型模式-简单工厂模式
[设计模式]创建型模式-简单工厂模式
|
2月前
|
设计模式 算法 Java
跟着GPT学设计模式之模板模式
模板模式是一种行为型设计模式,它定义了一个操作中的算法骨架,将一些步骤的具体实现延迟到子类中。该模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
44 6
|
1月前
|
设计模式 人工智能 达摩院
设计模式的基础问题之模板模式在软件开发中的优势是什么
设计模式的基础问题之模板模式在软件开发中的优势是什么
|
1月前
|
设计模式 项目管理
设计模式的基础问题之生成器模式在项目管理应用的问题如何解决
设计模式的基础问题之生成器模式在项目管理应用的问题如何解决