设计模式:模板方法模式

什么是模板方法?

定义了一个操作的算法骨架,而将算法的一些步骤延迟到子类中,使得子类在不修改该算法结构的情况下重定义该算法的某些特定步骤。

模板方法包含以下几个主要角色:

  • 抽象类 :
    • 负责给出一个算法的骨架和轮廓,它由一个模板方法和若干个基本方法组成。
  • 模板方法 :
    • 定义算法的骨架,按某种顺序调用其包含的基本方法
  • 基本方法 :是实现算法各个步骤的方法,是模板方法的组成部分,基本方法又可以分为 抽象方法、具体方法、钩子方法
    • 抽象方法
      由抽象类声明,由其具体子类实现
    • 具体方法
      由抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承
    • 钩子方法
      • 在抽象类中已经实现,包含用于判断的逻辑方法和需要子类重写的空方法两种
      • 一般钩子方法是用于判断的逻辑方法,这类方法名一般为:isXxxx,返回值类型为boolean。
  • 具体子类
    • 实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的组成步骤。

4+1视图

以MDM后台管理系统向终端发送指令为例:
uses <<abstract>> AbstractPushTemplate #String messageContent #List<String> targetUsers +final executePush() +#preparePayload() +#selectTargetChannel() +#connectToService(Object) +#doPush(Object, String) +#onSuccess() +#onFailure() AndroidPush +preparePayload() : Object +selectTargetChannel() : String +connectToService(Object) : boolean +doPush(Object, String) : boolean IOSPush +preparePayload() : Object +selectTargetChannel() : String +connectToService(Object) : boolean +doPush(Object, String) : boolean AdminMessageController +pushMessageToAll(AbstractPushTemplate pushStrategy)

模式解析与工作流程

抽象类 (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() 来触发整个推送流程,完全无需关心底层是哪个平台以及具体如何实现的。
相关推荐
daidaidaiyu5 小时前
ThingsBoard 集群的核心逻辑源码分析
java
2601_962885725 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen6 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
我可能是个假开发6 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong6 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
WL学习笔记7 小时前
日期类(C++)
开发语言·c++·日期类实现
【JAVA】玩家7 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring
Wang's Blog7 小时前
Java框架 SpringCloud 快速入门: 实现 Feign 最佳实践(抽取方式)
java·spring cloud
谢亮_vipxieliang8 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法
H.莓飛8 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio