设计模式——Template Method (模板方法)模式

本文详细介绍了模板方法模式,包括其书面和通俗解释,构造支付场景展示解决方案。阐述了该模式的适用场景,如方法设计与实现可分离、需为调用方留扩展能力的场景。还提及JDK中InputStream的应用,并对比了模板方法模式和抽象工厂模式的区别。

前言

体能状态先于精神状态,习惯先于决心,聚焦先于喜好。

模板方法模式

Template Method

书面用语

模板方法的意图是在一个方法里实现一个算法,并推迟定义算法中的某些步骤,从而让其他类重新定义他们。

大白话

在一个接口中定义一个抽象方法,或者在一个抽象类中定义一个抽象方法,或者在一个类中定义一个没有具体实现内部逻辑的普通方法,关键的一点是,该方法只是起到定义的作用,具体的实现步骤由实现者或继承者来完成。

构造一个场景
场景描述

·假设现在我们有两种支付方式,第一种支付方式限额0-1000,第二种限额1000-3000
第一种方式手续费较低,会作为优先选择
用户支付的金额一定大于0,并且小于3000
每个支付方式对接的服务提供者不同——入参出参等等

场景探究

·第一种支付方式支持0-1000,手续费较低
·第二种支持1000-3000
·用户的支付金额稳定在 0-3000之间,但是当低于1000时从手续费的角度考虑选择第一种比较合适
·两种支付方式来自不同服务提供者——会存在入参和出参,甚至交互方式的差异
·将来会再增加一个服务提供商吗?有可能

模板方法模式给出的解决方案
将支付方法进行抽象

·将支付方法进行抽象,创建两个子类,方式一和方式二
·方式一对该抽象方法进行实现
·方式二对该抽象方法进行实现
·调用时以支付金额作为判断依据,当金额在0-1000(含1000)之间时,调用方式一的类和相关方法;当金额在1000-3000之间时,调用方式二的类和相关方法

模板方法模式 适用场景

模板方法模式总是和其他设计模式一同使用,比如适配器模式、外观模式等等。
因为从一般使用来说,模板方法模式更多的形式是一个抽象方法,然后被其他类进行具体实现。
模板方法适用于那些方法设计与方法实现可以分离的场景,比如调用方并不关注服务提供方的实现方式,我只需要为其提供接口即可,然后通过远程调用使其获得具体的服务。
再一个,模板方法模式给方法的具体实现留下来足够的空间,所以当服务提供方想为服务调用方留下扩展能力时,可以使用这种模式,Spring 就是这么干的——如果你有阅读源码,在Spring 初始化环节,有一些方法就是空的实现,为了你能够对其进行覆盖增加个性化的逻辑。

JDK 中对模版方法模式应用——java.io.InputStream

InputStream 作为抽象类,定义了抽象方法,由子类去具体完成逻辑
可以参考另一片文章 从接口的抽象方法和抽象类的抽象方法说起

模版方法模式和抽象工厂模式都是用委托子类完成实现一组抽象,二者的区别是什么?

模板方法模式和抽象工厂模式确实有点相似之处,因为它们都将一部分行为的实现延迟到了子类中。然而,它们的关注点不同。

抽象工厂模式关注于创建一系列相关或相互依赖的对象,而不需要暴露具体的实现类。它提供了一个接口,由具体的工厂子类来创建这些相关对象。每个具体工厂子类可以根据需要创建不同的对象,以满足特定的目标。

相比之下,模板方法模式关注的是定义一个算法的结构和顺序,其中的某些具体步骤由子类来实现。父类中通过定义模板方法来控制算法的执行流程,而具体的实现则留给子类来完成。模板方法模式主要是为了提供一个通用的算法骨架,具体的实现可以通过子类来变化,以满足不同的需求。

所以,虽然模板方法模式和抽象工厂模式都使用了继承和多态的概念,但它们的关注点和应用场景是不同的。模板方法模式侧重于定义算法的结构和顺序,而抽象工厂模式侧重于创建一系列相关的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值