设计模式:模板方法模式
什么是模板方法?
定义了一个操作的算法骨架,而将算法的一些步骤延迟到子类中,使得子类在不修改该算法结构的情况下重定义该算法的某些特定步骤。
模板方法包含以下几个主要角色:
- 抽象类:
- 负责给出一个算法的骨架和轮廓,它由一个模板方法和若干个基本方法组成。
- 模板方法:
- 定义算法的骨架,按某种顺序调用其包含的基本方法
- 基本方法:是实现算法各个步骤的方法,是模板方法的组成部分,基本方法又可以分为 抽象方法、具体方法、钩子方法
- 抽象方法
由抽象类声明,由其具体子类实现 - 具体方法
由抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承 - 钩子方法
- 在抽象类中已经实现,包含用于判断的逻辑方法和需要子类重写的空方法两种
- 一般钩子方法是用于判断的逻辑方法,这类方法名一般为:isXxxx,返回值类型为boolean。
- 抽象方法
- 具体子类
- 实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的组成步骤。
4+1视图
以MDM后台管理系统向终端发送指令为例:
模式解析与工作流程
抽象类 (AbstractPushTemplate):
executePush()
(模板方法): 这是一个final
方法,定义了推送消息的固定流程骨架。它按顺序调用以下步骤方法。
基本方法:
preparePayload()
: (抽象方法) 准备平台特定的消息负载(例如,Android
用FCM
格式,iOS
用APNs
格式)。selectTargetChannel()
: (抽象方法) 选择推送的目标渠道(例如,“FCM” 或 “APNs”)。connectToService()
: (抽象方法) 建立与特定推送服务的连接。doPush()
: (抽象方法) 执行实际的推送操作。
钩子方法 (Hook Methods):
onSuccess()
,onFailure()
: 默认实现(例如记录日志),子类可选择重写以增加特定行为(如发送成功通知)。
具体子类 (AndroidPush, IOSPush):
- 继承自
AbstractPushTemplate
。 - 必须实现所有标记为
abstract
的步骤方法,提供针对各自平台(Android/iOS
)的具体实现。 - 可以选择性地重写钩子方法。
客户端/后台管理 (AdminMessageController):
- 它依赖于抽象类型
AbstractPushTemplate
,而不是具体实现。 - 通过调用
pushStrategy.executePush()
来触发整个推送流程,完全无需关心底层是哪个平台以及具体如何实现的。