Java通俗易懂系列设计模式之模板模式

 更新时间:2021年04月23日 08:55:45   作者:JaJian  
这篇文章主要介绍了Java通俗易懂系列设计模式之模板模式,想了解设计模式的同学,可以仔细看一下

实际开发中常常会遇到,代码骨架类似甚至相同,只是具体的实现不一样的场景。例如:流程都有开启、编辑、驳回、结束。每个流程都包含这几个步骤,不同的是不同的流程实例它们的内容不一样。共享单车都是先开锁、骑行、上锁、付款。这些大的步骤固定,不同的是每个实例的具体实现细节不一样。这些类似的业务我们都可以使用模板模式实现。为什么要使用模板模式以及如何使用呢?

介绍

定义:在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

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

  • 主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
  • 何时使用:有一些通用的方法。
  • 如何解决:将这些通用算法抽象出来。
  • 关键代码:在抽象类实现,其他步骤在子类实现。

实现

我们以生活中买菜做饭的例子来写个Demo,烧饭一般都是买菜、洗菜、烹饪、装盘四大过程。中国自古有八大菜系,制作方式肯定都避不开这四个过程。那在模板模式中如何实现呢?
创建一个抽象类,它的模板方法被设置为 final。为防止恶意操作,一般模板方法都加上 final 关键词。

public abstract class AbstractCookingService {
    //买菜
    protected abstract void shopping();
    //清洗
    protected abstract void wash();
    //烹饪
    protected abstract void cooking();
    //装盘
    protected abstract void dishedUp();

    public final void process() {
        shopping();
        wash();
        cooking();
        dishedUp();
    }
}

创建实现了上述抽象类的子类。
// 徽菜烹饪

/**
 * 徽菜制作大厨
 */
public class HuiCaiChef extends AbstractCookingService {

    @Override
    protected void shopping() {
        System.out.println("买菜:新鲜鱼一条,红辣椒五两");
    }

    @Override
    protected void wash() {
        System.out.println("清洗:红椒洗净切片,鱼头半分");
    }

    @Override
    protected void cooking() {
        System.out.println("烹饪:鱼头水蒸,辣椒过油");
    }

    @Override
    protected void dishedUp() {
        System.out.println("装盘:用长形盘子装盛");
    }
}

// 川菜烹制

/**
 * 川菜制作大厨
 */
public class HuiCaiChef extends AbstractCookingService {

    @Override
    protected void shopping() {
        System.out.println("买菜:黑猪肉一斤,蒜头5个");
    }

    @Override
    protected void wash() {
        System.out.println("清洗:猪肉洗净,蒜头去皮");
    }

    @Override
    protected void cooking() {
        System.out.println("烹饪:大火翻炒,慢火闷油");
    }

    @Override
    protected void dishedUp() {
        System.out.println("装盘:深碗盛起,热油浇拌");
    }
}

使用 TemplatePatternDemo 类执行模板方法 process() 来演示烹饪的定义方式。

public class TemplatePatternDemo {

    public static void main(String[] args) {
        System.out.println("----------川菜制作------------");
        AbstractCookingService chuanCaiService = new ChuanCaiChef();
        chuanCaiService.process();
        System.out.println("-----------徽菜制作-----------");
        AbstractCookingService huiCaiService = new HuiCaiChef();
        huiCaiService.process();
    }
}

执行程序,输出结果:

----------川菜制作------------

买菜:新鲜鱼一条,红辣椒五两

清洗:红椒洗净切片,鱼头半分

烹饪:鱼头水蒸,辣椒过油

装盘:用长形盘子装盛

-----------徽菜制作-----------

买菜:黑猪肉一斤,蒜头5个

清洗:猪肉洗净,蒜头去皮

烹饪:大火翻炒,慢火闷油

从以上实例可以看出,其实模板模式也没什么高深莫测的,简单来说就是三大步骤:

  1. 创建一个抽象类,定义几个抽象方法和一个final修饰的模板方法,而模板方法中设定了抽象方法的执行顺序或逻辑。
  2. 无论子类有多少个,只需要继承该抽象类,实现父类的抽象方法重写自己的业务。
  3. 根据不同的需求创建不同的子类实现,每次调用的地方只需调用模板方法,即可完成特定的模板流程。

总结

从以上的分析和Demo我们可以看到,模板方法提高了我们的代码的可维护性和可扩展性。有优点也有缺点。
优点:

  1. 封装不变部分,扩展可变部分。
  2. 提取公共代码,便于维护。
  3. 行为由父类控制,子类实现。

缺点:

每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景:

  • 有多个子类共有的方法,且逻辑相同。
  • 重要的、复杂的方法,可以考虑作为模板方法。

以上就是Java通俗易懂系列设计模式之模板模式的详细内容,更多关于Java设计模式的资料请关注脚本之家其它相关文章!

相关文章

  • MyBatis框架底层的执行原理源码解析

    MyBatis框架底层的执行原理源码解析

    这篇文章主要介绍了MyBatis框架底层的执行原理源码解析,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Java的Semaphore信号量使用及原理解读

    Java的Semaphore信号量使用及原理解读

    这篇文章主要介绍了Java的Semaphore信号量使用及原理解读,Semaphore(信号量)是Java中一个并发控制工具,用于控制对共享资源的访问,它基于计数器的原理,可以限制同时访问某个资源的线程数量,需要的朋友可以参考下
    2023-12-12
  • MyBatis discriminator标签原理实例解析

    MyBatis discriminator标签原理实例解析

    这篇文章主要为大家介绍了MyBatis discriminator标签实现原理实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java Spring快速入门

    Java Spring快速入门

    本文主要介绍了SpringSpring简介和入门知识。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • java实现简单银行家算法

    java实现简单银行家算法

    这篇文章主要为大家详细介绍了java实现简单银行家算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • springboot 跨域配置类及跨域请求配置

    springboot 跨域配置类及跨域请求配置

    这篇文章主要介绍了springboot 跨域配置类及跨域请求配置,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • Caused by: java.lang.NumberFormatException: For input string: “port“(问题解决)

    Caused by: java.lang.NumberFormatException: For input s

    这篇文章主要介绍了Caused by: java.lang.NumberFormatException: For input string: “port“,本文给大家分享完美解决方法,需要的朋友可以参考下
    2023-01-01
  • IDEA 2021.3 使用及idea2021.3.1激活使用方法

    IDEA 2021.3 使用及idea2021.3.1激活使用方法

    IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,今天通过本文给大家介绍idea2021.3.1激活及使用教程,感兴趣的朋友一起看看吧
    2022-01-01
  • Java中关于 null 的几种处理方式详解

    Java中关于 null 的几种处理方式详解

    这篇文章主要介绍了Java中关于 null 的几种处理方式,关于 null ,你应该知道下面这几件事情来有效的了解 null ,从而避免很多由 null 引起的错误,具体细节跟随小编一起学习下吧
    2021-10-10
  • 详解使用Java代码读取并比较本地两个txt文件区别

    详解使用Java代码读取并比较本地两个txt文件区别

    这篇文章主要为大家介绍了使用Java代码读取并比较本地两个txt文件区别详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论