首页 > 编程语言 >设计模式-模板模式在Java中的使用示例

设计模式-模板模式在Java中的使用示例

时间:2022-11-01 10:36:14浏览次数:71  
标签:Java 示例 子类 void System println 设计模式 模板 out

场景

模板模式

模板模式又叫模板方法模式(Template Method Pattern),是指定义一个算法的骨架,并允许子类为一个

或者多个步骤提供实现。

模板模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为型设计模式。

模板模式适用于以下场景:

1、一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。

2、各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。

以网络销售商品为例,模板流程大体为:

上架商品-下订单-发快递-收货 ,如果需要退货还需进行退货流程。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

模板模式示例

首先创建NetworkGoods抽象类

package com.ruoyi.demo.designPattern.templatePattern;

public abstract class NetworkGoods {
   
    protected final void saleGoods(){
        //上架商品
        this.groundGoods();
        //下订单
        this.placeOrder();
        //发快递
        this.express();
        //收货
        this.receipt();
        //是否需要退货
        if(needReturnGoods()){
            doReturnGoods();
        }
    }

    //进行退货
    abstract void doReturnGoods();

    //是否需要退货
    //钩子方法:实现流程的微调
    protected  boolean  needReturnGoods(){
        return false;
    }
    //上架商品
    final void groundGoods(){
        System.out.println("上架商品");
    }

    //下订单
    final void placeOrder(){
        System.out.println("下订单");
    }

    //发快递
    final void express(){
        System.out.println("发快递");
    }

    //收货
    final void receipt(){
        System.out.println("收货");
    }
}

上面代码中有个钩子方法,主要目的是干预执行流程,使得控制行为更加灵活,更符合实际业务的需求。

然后创建ComputerGoodsSale

package com.ruoyi.demo.designPattern.templatePattern;

public class ComputerGoodsSale extends NetworkGoods{
    @Override
    void doReturnGoods() {
        System.out.println("电脑进行退货");
    }
}

创建BookGoodsSale

package com.ruoyi.demo.designPattern.templatePattern;

public class BookGoodsSale extends NetworkGoods{

    private boolean needReturnGoodsFlag = false;

    public BookGoodsSale(boolean needReturnGoodsFlag){
        this.needReturnGoodsFlag = needReturnGoodsFlag;
    }

    @Override
    protected boolean needReturnGoods() {
        return this.needReturnGoodsFlag;
    }

    @Override
    void doReturnGoods() {
        System.out.println("书籍进行退货");
    }
}

客户端测试代码

package com.ruoyi.demo.designPattern.templatePattern;

public class networkGoodsSaleTest {
    public static void main(String[] args) {
        System.out.println("电脑进行网络销售");
        NetworkGoods computerGoods = new ComputerGoodsSale();
        computerGoods.saleGoods();

        System.out.println("书籍进行网络销售");
        NetworkGoods bookGoods = new BookGoodsSale(true);
        bookGoods.saleGoods();
    }
}

模板模式的经典应用场景-JdbcTemplate

创建模板类JdbcTemplate,封装所有的JDBC操作。以查询为例,每次查询的表不同,返回的

数据结构也不一样。针对不同的数据,都要将其封装成不同的实体对象。而每个实体对象的发封装

逻辑是不一样的,但是封装前和封装后的流程是不变的。

模板模式的优缺点

优点:

1、利用模板模式将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。

2、将不同的代码放到不同的子类中,通过对子类的扩展增加新的行为,可以提高代码的扩展性。

3、将不变的行为写在父类中,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。

缺点:

1、每个抽象类都需要一个子类来实现,导致了类的数量增加。

2、类数量的增加间接地增加了系统的复杂性。

3、因为继承关系自身的缺点,如果父类增加新的抽象方法,所有子类都要改一遍。

标签:Java,示例,子类,void,System,println,设计模式,模板,out
From: https://www.cnblogs.com/badaoliumangqizhi/p/16846847.html

相关文章

  • Java解析cron表达式
    概述Cron表达式是一个字符串,以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,即两种语法格式:SecondsMinutesHoursDayofMonthMonthDayofWeekYear,即:秒分时天月星......
  • Java8学习笔记
    Java8引入函数式编程,好处:代码简洁,意图明确,使用stream接口而不是for循环。多核友好,parallel()方法。相关知识高阶函数高阶函数就是接收函数参数的函数,能够根据传入的函数参......
  • Java学习之位运算(操作)总结
    最近在反思工作第四年的深度,故而写此系列。其他Java系列文章:​​Java学习之编译、反编译以及字节码入门​​​​Java学习之String​​​​Java学习之JDK9新特性​​位操作,......
  • Java学习之NoClassDefFoundError、ClassNotFoundException、NoSuchMethodError
    在菜逼如我短短的三年职业编码生涯中,无数次遇到这两个异常,故而总结一下。Java异常体系大致提一些,不是本文的重点。两者都是标准异常,平时碰到最多的是ClassNotFoundExceptio......
  • Java学习之String
    概述写在前面,工作第四年,重新把基础抓起来吧。String可以说是JDK中最基础的一个类。就记录一些日常开发中最常用的方法。String类是非可变类,其对象一旦创建,就不可销毁。Strin......
  • Java学习之JDK9新特性
    写在前面:现在(2019-01-12)绝大多数的公司或者个人都在使用JDK8,这一点毋庸置疑,但是不排除那些需要自我反省一下的落后者还在使用JDK5~7。毕竟JDK12都出来了。参考​​​JDK12......
  • 面试之基础算法题:求一个数字在给定的已排序数组中出现的起始、终止索引号(Java版)
    题目给定一个升序的整数数组,查找某一个值在数组中出现的索引号,例如,输入数组​​[2,3,3,4,4,5]​​​;查找的数是3,则返回​​[1,2]​​。时间复杂度要求为O(logN)。思路......
  • java操作http请求的三种方式
    java操作http请求的三种方式一、HttpClient步骤:1.获取一个Http客户端CloseableHttpClienthttpClient=HttpClients.createDefault();2.创建一个请求HttpGethttpGet......
  • 设计模式之享元模式
    概述当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。例如,在一个文本字符串中存在很多重复的字符,如果每一个字符都用一个单独的对象......
  • Java 基于 SpringCloud 数据中台 ETL 工具,可以进行多种常见数据库之间的数据或结构迁
    基于SpringCloud数据中台ETL工具,可以进行多种常见数据库之间的数据或结构迁移提供源端数据库向目的端数据库的批量迁移同步功能,支持数据的全量和增量方式同步。包括:......