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


    场景

    模板模式

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

    或者多个步骤提供实现。

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

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

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

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

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

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

    注:

    博客:
    霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    模板模式示例

    首先创建NetworkGoods抽象类

    1. package com.ruoyi.demo.designPattern.templatePattern;
    2. public abstract class NetworkGoods {
    3.    
    4.     protected final void saleGoods(){
    5.         //上架商品
    6.         this.groundGoods();
    7.         //下订单
    8.         this.placeOrder();
    9.         //发快递
    10.         this.express();
    11.         //收货
    12.         this.receipt();
    13.         //是否需要退货
    14.         if(needReturnGoods()){
    15.             doReturnGoods();
    16.         }
    17.     }
    18.     //进行退货
    19.     abstract void doReturnGoods();
    20.     //是否需要退货
    21.     //钩子方法:实现流程的微调
    22.     protected  boolean  needReturnGoods(){
    23.         return false;
    24.     }
    25.     //上架商品
    26.     final void groundGoods(){
    27.         System.out.println("上架商品");
    28.     }
    29.     //下订单
    30.     final void placeOrder(){
    31.         System.out.println("下订单");
    32.     }
    33.     //发快递
    34.     final void express(){
    35.         System.out.println("发快递");
    36.     }
    37.     //收货
    38.     final void receipt(){
    39.         System.out.println("收货");
    40.     }
    41. }

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

    然后创建ComputerGoodsSale

    1. package com.ruoyi.demo.designPattern.templatePattern;
    2. public class ComputerGoodsSale extends NetworkGoods{
    3.     @Override
    4.     void doReturnGoods() {
    5.         System.out.println("电脑进行退货");
    6.     }
    7. }

    创建BookGoodsSale

    1. package com.ruoyi.demo.designPattern.templatePattern;
    2. public class BookGoodsSale extends NetworkGoods{
    3.     private boolean needReturnGoodsFlag = false;
    4.     public BookGoodsSale(boolean needReturnGoodsFlag){
    5.         this.needReturnGoodsFlag = needReturnGoodsFlag;
    6.     }
    7.     @Override
    8.     protected boolean needReturnGoods() {
    9.         return this.needReturnGoodsFlag;
    10.     }
    11.     @Override
    12.     void doReturnGoods() {
    13.         System.out.println("书籍进行退货");
    14.     }
    15. }

    客户端测试代码

    1. package com.ruoyi.demo.designPattern.templatePattern;
    2. public class networkGoodsSaleTest {
    3.     public static void main(String[] args) {
    4.         System.out.println("电脑进行网络销售");
    5.         NetworkGoods computerGoods = new ComputerGoodsSale();
    6.         computerGoods.saleGoods();
    7.         System.out.println("书籍进行网络销售");
    8.         NetworkGoods bookGoods = new BookGoodsSale(true);
    9.         bookGoods.saleGoods();
    10.     }
    11. }

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

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

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

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

    模板模式的优缺点

    优点:

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

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

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

    缺点:

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

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

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

  • 相关阅读:
    axios请求参数的三种方式
    码蹄集需要频繁登录?如何做到“一劳永逸”——码蹄集只登录一次久久不掉线的教程
    Linux网络编程(socket的udp通信)
    nginx 访问静态文件404错误
    AMRT 3D轻量化图形引擎发布预告,三维场景搭建、视频流交互,众多功能抢先体验!
    shell脚本命令学习
    Jmeter系列-Jmeter面板介绍和常用配置(2)
    Java书签 #获取项目应用中所有Mapper接口并打印URL
    不容易解的题9.26
    LeetCode题目笔记——01.09. 字符串轮转
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127628910