当前位置: 首页 >  网技达人 >  模板模式

模板模式

导读:模板模式的定义.其定义如下:.Define the skeleton of an algorithm in an operation,deferring some steps to.subclasses.Template Method lets subclasses redefi

模板模式的定义

其定义如下:
Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.(定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。)

模板模式通用类图

模板模式通用代码

抽象模板类
public abstract class AbstractClass {
    //基本方法
    protected abstract void doSomething();
    //基本方法
    protected abstract void doAnything();
    //模板方法
    public void templateMethod(){
        /*
         * 调用基本方法,完成相关的逻辑
         */
        this.doAnything();
        this.doSomething();
    }
}
具体模板类
public class ConcreteClass1 extends AbstractClass {
    //实现基本方法
    protected void doAnything() {
    //业务逻辑处理
    }
    protected void doSomething() {
    //业务逻辑处理
    }
}
public class ConcreteClass2 extends AbstractClass {
    //实现基本方法
    protected void doAnything() {
    //业务逻辑处理
    }
    protected void doSomething() {
    //业务逻辑处理
    }
}
场景类
public class Client {
    public static void main(String[] args) {
        AbstractClass class1 = new ConcreteClass1();
        AbstractClass class2 = new ConcreteClass2();
         //调用模板方法
        class1.templateMethod();
        class2.templateMethod();
    }
}

模板模式的优点

  1. 封装不变部分,扩展可变部分。
    把认为是不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。

  2. 提取公共部分代码,便于维护。

  3. 行为由父类控制,子类实现。
    基本方法是由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。

模板方法模式的缺点

按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。

模板方法模式的使用场景

● 多个子类有公有的方法,并且逻辑基本相同时。
● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数(见“模板方法模式的扩展”)约束其行为。

场景示例

我现在有这么一个业务,医院每次病人看病,缴费都有这么一个大概的流程 构建订单->病人支付->系统处理支付的业务逻辑。
因为支付业务是可以分多种的,比如挂号缴费,门诊缴费,构建订单和病人支付的流程都是不变的,针对不同的类型的缴费业务,缴费完成后系统需要处理不同的业务逻辑。现在可以使用模板模式编写代码。

抽象模板类
/**
 * 就诊模板
 */
public abstract class VisitProcessTemplate {

    /**
     * 构建订单
     */
    public void initOrder(){
        System.out.println("构建订单");
    }

    /**
     * 支付
     */
    public void orderPay(){
        System.out.println("订单支付");
    }

    /**
     * 处理下单之后的业务逻辑
     */
    public abstract void payOk();

    /**
     * 就诊流程
     */
    public void visitRun(){
        initOrder();
        orderPay();
        payOk();
    }
}
挂号具体模板类
public class RegisterVisitProcess extends VisitProcessTemplate{
    @Override
    public void payOk() {
        System.out.println("支付成功,处理病人挂号业务");
    }
}
门诊缴费具体模板类
public class OutpatientVisitProcess extends VisitProcessTemplate{

    @Override
    public void payOk() {
        System.out.println("支付成功,处理病人门诊缴费业务");
    }
}
场景类
public class Client {
    public static void main(String[] args) {
        VisitProcessTemplate visitProcessTemplate = new OutpatientVisitProcess();
        VisitProcessTemplate visitProcessTemplate1 = new RegisterVisitProcess();
        visitProcessTemplate.visitRun();
        visitProcessTemplate1.visitRun();
    }
}

模板方法模式的扩展(钩子函数)

假如我现在新增了一个业务,这个业务是医院诊疗卡办理服务,这个业务是免费的,病人无需费用就可以办卡,可别的业务又需要支付,该怎么优化这段代码呢?使用钩子函数。

优化后的就诊模板
/**
 * 就诊模板
 */
public abstract class VisitProcessTemplate {

    /**
     * 构建订单
     */
    public void initOrder(){
        System.out.println("构建订单");
    }

    /**
     * 支付
     */
    public void orderPay(){
        System.out.println("订单支付");
    }

    /**
     * 处理下单之后的业务逻辑
     */
    public abstract void payOk();

    /**
     * 钩子函数,默认需要支付
     */
    public boolean needPay(){
        return true;
    }
    /**
     * 就诊流程
     */
    public void visitRun(){
        initOrder();
        if (needPay()){
            orderPay();
        }
        payOk();
    }
}
办卡具体模板类
public class CardVisitProcess extends VisitProcessTemplate{
    @Override
    public void payOk() {
        System.out.println("处理病人办卡业务");
    }

    @Override
    public boolean needPay() {
        return false;
    }
}
内容
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • 详解数据结构中栈的定义和操作
    详解数据结构中栈的定义和操作
    2023-12-08
    摘要: 本文为大家详解数据结构中栈的定义和操作。.本文分享自华为云社区《数据结构:详细讲解栈的定义、栈的操作》,作者:
  • Hutool:一行代码搞定数据脱敏
    Hutool:一行代码搞定数据脱
    2023-12-07
    1. 什么是数据脱敏.1.1 数据脱敏的定义.数据脱敏百度百科中是这样定义的:.数据脱敏,指对某些敏感信息通过脱敏规则进
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • 软件定制开发服务
    软件定制开发服务
    2024-01-05
    软件定制开发服务.产品功能.我们的软件定制开发服务为客户提供了一站式的解决方案,包括需求分析、设计开发、**部署和维护支
  • ***安全解决方案
    ***安全解决方案
    2024-01-10
    ***安全解决方案.产品功能.我们的服务器安全解决方案是一款专为企业服务器量身定制的安全软件,旨在保护企业服务器免受恶意
  • 电子元件芯片
    电子元件芯片
    2024-01-20
    电子元件芯片.产品功能.电子元件芯片是一种微型电子元件,其具有高性能、高可*性和低功耗的特点。它广泛应用于手机、电脑、家
  • ***远程监控系*
    ***远程监控系*
    2023-12-16
    ***远程监控系*.产品功能.我们的服务器远程监控系*是一款针对企业服务器管理的智能监控系*。它具有实时监控、远程操作、
  • 电子元件模块
    电子元件模块
    2023-12-21
    电子元件模块.我们的电子元件模块是一款专为电子爱好者和工程师设计的多功能模块。它集成了多种常用的电子元件和功能模块,可以
  • 电子元件连接器
    电子元件连接器
    2023-12-31
    电子元件连接器.产品功能.电子元件连接器是一种用于连接不同电子元件的重要组件。它可以提供可*的电气连接,从而实现各种电子
  • 人工智能应用软件
    人工智能应用软件
    2024-01-15
    人工智能应用软件产品介绍.产品功能.我们的人工智能应用软件集成了多种先进的人工智能技术,包括机器学习、自然语言处理、计算
  • ***数据备份方案
    ***数据备份方案
    2024-01-15
    ***数据备份方案.产品功能.自动化备份:定期自动备份***上的数据,无需人工干预,确保数据的及时、准确备份。.数据恢复
  • ***软件
    ***软件
    2023-12-06
    ***软件产品介绍.产品描述.我们的服务器软件是一款高性能、稳定可靠的服务器管理软件,具有强大的功能和灵活的配置,适用于
  • 移动应用开发
    移动应用开发
    2023-12-01
    移动应用开发.产品描述.移动应用开发是一种专注于为移动设备(如智能手机、平板电脑)开发应用程序的技术和流程。这些应用程序