广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java设计模式之模板方法详解
  • 328
分享到

Java设计模式之模板方法详解

2024-04-02 19:04:59 328人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录概念核心设计要点优缺点应用场景模板方法和策略模式的区别代码案例概念 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术,没有关联关系。因此,在模板方法

概念

模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术,没有关联关系。因此,在模板方法模式的类结构图中,只有继承关系。

核心设计要点

AbstractClass:抽象类,定义并实现一个模板方法。这个模板方法定义了算法的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类去实现。

ConcreteClass:实现实现父类所定义的一个或多个抽象方法。。

优缺点

优点

  • 利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。
  • 将不同的代码不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性。
  • 把不变的行为写在父类.上,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。

缺点

类数目的增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加,复杂性增加。类数量的增加,间接地增加了系统实现的复杂度。继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一-遍。

应用场景

  • 父类视角:一次性实现一个算法不变的部分,并将可变部分留给子类实现;
  • 子类视角:各个子类中,公共部分被提取出来,集中到一个公共的父类中,避免代码重复;

模板方法模式的目的是让子类可以扩展或具体实现固定方法的某个具体的步骤;对于模板来说,是一套固定的算法 ,通过子类可以扩展固定算法中某些算法步骤。

模板方法和策略模式的区别

策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。还有一种模

式也是关注对算法的封装一模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类

Context,它与模版方法模式的区别在于:在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主

体则是封装到了封装类Context中,抽象策略Strategy一般是一个接口, 目的只是为了定义规范,里面一般不包含逻辑。其实,这只是通用实现,而在实际编程中,因为各个具体策略实现类之间难免存在–些相同的逻辑,为了避免重复的代码,我们常常使用抽象类来担任Strategy的角色,在里面封装公共的代码,因此,在很多应用的场景中,在策略模式中- -般会看到模版方法模式的影子。

代码案例

模版方法抽象类

@Slf4j
public abstract class AbstractPayCallbackTemplate {
    
    public String asyncCallBack() {
        // 1. 支付回调验证参数
        Map<String, String> verifySignatureMap = verifySignature();
        // 2. 参数验证成功,写入日志中..
        payLog(verifySignatureMap);
        String analysisCode = verifySignatureMap.get("analysisCode");
        if (!analysisCode.equals("200")) {
            return resultFail();
        }
        // 3. 执行回调异步相关逻辑
        return asyncService(verifySignatureMap);
    }
    
    protected abstract Map<String, String> verifySignature();
    
    @Async
    void payLog(Map<String, String> verifySignatureMap) {
        log.info(">>>>>>>>>>第二步 写入payLog........");
    }
    
    protected abstract String asyncService(Map<String, String> verifySignatureMap);
    
    protected abstract String resultSuccess();
    
    protected abstract String resultFail();
}

具体实现模版类

@Log4j2
public class AliPayCallbackTemplate extends AbstractPayCallbackTemplate {
    @Override
    protected Map<String, String> verifySignature() {
        //>>>>假设一下为银联回调报文>>>>>>>>>>>>>>>>
        log.info(">>>>>第一步 解析支付宝据报文.....verifySignature()");
        Map<String, String> verifySignature = new HashMap<>();
        verifySignature.put("price", "1399");
        verifySignature.put("orderDes", "充值永久会员");
        // 支付状态为1表示为成功....
        verifySignature.put("aliPayMentStatus", "1");
        verifySignature.put("aliPayOrderNumber", "201910101011");
        // 解析报文是否成功 200 为成功..
        verifySignature.put("analysisCode", "200");
        return verifySignature;
    }
    @Override
    protected String asyncService(Map<String, String> verifySignatureMap) {
        log.info(">>>>>第三步asyncService()verifySignatureMap:{}", verifySignatureMap);
        String paymentStatus = verifySignatureMap.get("aliPayMentStatus");
        if (paymentStatus.equals("1")) {
            String aliPayOrderNumber = verifySignatureMap.get("aliPayOrderNumber");
            log.info(">>>>orderNumber:{aliPayOrderNumber},已经支付成功 修改订单状态为已经支付...");
        }
        return resultSuccess();
    }
    @Override
    protected String resultSuccess() {
        return "ok";
    }
    @Override
    protected String resultFail() {
        return "fail";
    }
}
@Slf4j
public class UNIOnPayCallbackTemplate extends AbstractPayCallbackTemplate {
    @Override
    protected Map<String, String> verifySignature() {
        //>>>>假设一下为银联回调报文>>>>>>>>>>>>>>>>
        log.info(">>>>>第一步 解析银联数据报文.....verifySignature()");
        Map<String, String> verifySignature = new HashMap<>();
        verifySignature.put("price", "1399");
        verifySignature.put("orderDes", "充值永久会员");
        // 支付状态为1表示为成功....
        verifySignature.put("paymentStatus", "1");
        verifySignature.put("orderNumber", "201910101011");
        // 解析报文是否成功 200 为成功..
        verifySignature.put("analysisCode", "200");
        return verifySignature;
    }
    @Override
    protected String asyncService(Map<String, String> verifySignatureMap) {
        log.info(">>>>>第三步asyncService()verifySignatureMap:{}", verifySignatureMap);
        String paymentStatus = verifySignatureMap.get("paymentStatus");
        if (paymentStatus.equals("1")) {
            String orderNumber = verifySignatureMap.get("orderNumber");
            log.info(">>>>orderNumber:{orderNumber},已经支付成功 修改订单状态为已经支付...");
        }
        return resultSuccess();
    }
    @Override
    protected String resultSuccess() {
        return "success";
    }
    @Override
    protected String resultFail() {
        return "fail";
    }
}

工厂模式获取模版

public class TemplateFactory {
    private final static Map<String, AbstractPayCallbackTemplate> templateMap = new ConcurrentHashMap<>();
    static {
        templateMap.put("aliPay", new AliPayCallbackTemplate());
        templateMap.put("unionPay", new UnionPayCallbackTemplate());
    }
    public static AbstractPayCallbackTemplate getPayCallbackTemplate(String templateId) {
        AbstractPayCallbackTemplate payCallbackTemplate = (AbstractPayCallbackTemplate) templateMap.get(templateId);
        return payCallbackTemplate;
    }
}

测试

public class Test {
    public static void main(String[] args) {
        AbstractPayCallbackTemplate aliPay = TemplateFactory.getPayCallbackTemplate("aliPay");
        String s = aliPay.asyncCallBack();
        System.out.println(s);
    }
}

到此这篇关于Java设计模式之模板方法详解的文章就介绍到这了,更多相关Java模板方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java设计模式之模板方法详解

本文链接: https://www.lsjlt.com/news/165281.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java设计模式之模板方法模式详解
    目录模板方法模式模板方法模式的优缺点使用场景总结模板方法模式 模板方法模式法(Template Method)定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不...
    99+
    2022-11-13
  • Java设计模式之java模板方法模式详解
    目录模板方法模式介绍角色代码演示模板方法模式总结优点缺点适用场景源码分析模板方法模式的典型应用Servlet 中的模板方法模式Hello World!Spring中的IOC容器启动—...
    99+
    2022-11-12
  • Java设计模式之模板方法详解
    目录概念核心设计要点优缺点应用场景模板方法和策略模式的区别代码案例概念 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术,没有关联关系。因此,在模板方法...
    99+
    2022-11-13
  • Java设计模式之模板方法模式TemplateMethodPattern详解
    目录概述模板方法模板方法模式好莱坞原则好莱坞原则与依赖倒置原则真实案例模板方法模式的注意事项和细节概述 模板方法 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。那...
    99+
    2022-11-13
    Java模板方法模式 Java Template Method Pattern
  • Java设计模式之模板方法模式
    在我们实际开发中,如果一个方法极其复杂时,如果我们将所有的逻辑写在一个方法中,那维护起来就很困难,要替换某些步骤时都要重新写,这样代码的扩展性就很差,当遇到这种情况就要考虑今天的主角...
    99+
    2022-11-13
    Java 设计模式 模板方法模式
  • Java行为型设计模式之模板方法详解
    目录模板方法模式应用场景主要角色优缺点模板方法模式的基本使用创建抽象模板角色创建具体实现客户端调用模板方法模式 模板方法模式属于行为型设计模式。它是指定义一个操作中的算法的框架,而将...
    99+
    2022-11-13
  • PHP设计模式之模板方法模式TemplateMethodPattern详解
    目录简介适用场景优点缺点其它代码简介 模板方法模式,是行为型的设计模式。 定义一个操作中的算法的骨架,而将一些步骤延迟到子类当中,使得子类可以不改变一个算法的结构即可重新定义该算法的...
    99+
    2022-12-20
    PHP设计模式之模板方法模式 PHP模板方法模式
  • 深入理解Java设计模式之模板方法模式
    目录一、什么是模板方法模式二、模板方法模式的使用场景三、模板方法模式的优缺点四、模板方法模式的实现五、总结一、什么是模板方法模式 模板方法模式在一个方法中定义一个算法的骨架,而将一些...
    99+
    2022-11-12
  • Java设计模式之浅谈模板方法模式
    一. 什么是模板方法设计模式 从字面意义上理解, 模板方法就是定义出来一套方法, 作为模板, 也就是基础。 在这个基础上, 我们可以进行加工,实现个性化的实现。比如:一日餐三. 早餐...
    99+
    2022-11-12
  • Java设计模式之工厂方法模式详解
    目录1.工厂方法是什么2.如何实现3.代码实现4.工厂方法模式的优点5.拓展1.工厂方法是什么 众所周知,工厂是生产产品的,并且产品供消费者使用。消费者不必关心产品的生产过程,只需要...
    99+
    2022-11-13
  • Java设计模式-模板方法模式
    定义Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subcl...
    99+
    2023-06-05
  • Java中常用的设计模式之模板模式详解
    目录优点缺点使用场景一、实现方式1、游戏抽象类2、LOL游戏类3、CF游戏类二、测试总结优点 封装不变部分,扩展可变部分。 提取公共代码,便于维护。 行为由父类控制,子类实现。 缺点...
    99+
    2022-11-13
  • Java设计模式之模板方法模式实例分析
    本文小编为大家详细介绍“Java设计模式之模板方法模式实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式之模板方法模式实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。模板方法模式模板方...
    99+
    2023-06-29
  • 分析设计模式之模板方法Java实现
    目录一、什么是模板方法设计模式1.1、模板方法的用途1.2、模板方法的定义二、定义模板方法的步骤2.1、定义模板类2.2、定义具体子类2.3、定义客户端调用2.4 下抽象类和子类之间...
    99+
    2022-11-12
  • java设计模式之工厂方法详解
    一、概念         工厂方法模式是类的创建模式,又叫虚拟构造子模式(virtual constructor) 或者多态性工厂模式。二、模式动机 ...
    99+
    2023-05-31
    java 设计模式 工厂方法
  • 怎么理解Java设计模式的模板方法模式
    这篇文章主要讲解了“怎么理解Java设计模式的模板方法模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java设计模式的模板方法模式”吧!一、什么是模板方法模式模板方法模式在一个方...
    99+
    2023-06-25
  • Java设计模式之java状态模式详解
    目录状态模式的结构状态模式的角色 示例代码适用场景投票案例认识状态模式状态和行为行为的平行性环境和状态处理对象状态模式优点状态模式的缺点状态模式和策略模式对比参考文章 总结...
    99+
    2022-11-12
  • Java设计模式之java策略模式详解
    目录为什么使用策略模式?策略模式包含角色策略模式的类图排序案例策略模式的优点策略模式的缺点适用场景源码分析策略模式的典型应用Java Comparator 中的策略模式参考文...
    99+
    2022-11-12
  • Java设计模式之java命令模式详解
    目录命令模式的介绍角色订单案例命令模式的优点适用场景示例代码应用宏命令----执行一组命令示例代码总结JDK源码解析 Runable是一个典型命令模式,Runnable担当命令的角色...
    99+
    2022-11-12
  • Java设计模式之java桥接模式详解
    目录一、什么是桥接模式:二、UML结构图:三、代码实现:四、JDBC源码解析-桥接模式:1、源码分析:2、源码类图:3、对 JDBC 的观点:参考博客:总结一、什么是桥接模式: 桥接...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作