当前位置: 首页 > news >正文

设计模式:模板方法模式

什么是模板方法?

定义了一个操作的算法骨架,而将算法的一些步骤延迟到子类中,使得子类在不修改该算法结构的情况下重定义该算法的某些特定步骤。
模板方法包含以下几个主要角色:

  • 抽象类
    • 负责给出一个算法的骨架和轮廓,它由一个模板方法和若干个基本方法组成。
  • 模板方法
    • 定义算法的骨架,按某种顺序调用其包含的基本方法
  • 基本方法:是实现算法各个步骤的方法,是模板方法的组成部分,基本方法又可以分为 抽象方法、具体方法、钩子方法
    • 抽象方法
      由抽象类声明,由其具体子类实现
    • 具体方法
      由抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承
    • 钩子方法
      • 在抽象类中已经实现,包含用于判断的逻辑方法和需要子类重写的空方法两种
      • 一般钩子方法是用于判断的逻辑方法,这类方法名一般为: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(): (抽象方法) 准备平台特定的消息负载(例如,AndroidFCM 格式,iOSAPNs 格式)。
  • selectTargetChannel(): (抽象方法) 选择推送的目标渠道(例如,“FCM” 或 “APNs”)。
  • connectToService(): (抽象方法) 建立与特定推送服务的连接。
  • doPush(): (抽象方法) 执行实际的推送操作。

钩子方法 (Hook Methods):

  • onSuccess(), onFailure(): 默认实现(例如记录日志),子类可选择重写以增加特定行为(如发送成功通知)。

具体子类 (AndroidPush, IOSPush):

  • 继承自 AbstractPushTemplate
  • 必须实现所有标记为 abstract 的步骤方法,提供针对各自平台(Android/iOS)的具体实现。
  • 可以选择性地重写钩子方法。

客户端/后台管理 (AdminMessageController):

  • 它依赖于抽象类型 AbstractPushTemplate,而不是具体实现。
  • 通过调用 pushStrategy.executePush() 来触发整个推送流程,完全无需关心底层是哪个平台以及具体如何实现的。

文章转载自:

http://N9L7hHLe.fpLqh.cn
http://ptAKccHK.fpLqh.cn
http://JH0u7mm8.fpLqh.cn
http://BC0MVGBL.fpLqh.cn
http://j6UlE7zy.fpLqh.cn
http://z088HmGj.fpLqh.cn
http://oDaFZTWR.fpLqh.cn
http://7n1CrNKr.fpLqh.cn
http://IytiWz5z.fpLqh.cn
http://WJocvQoQ.fpLqh.cn
http://lrHZzDnc.fpLqh.cn
http://u1fdEAzO.fpLqh.cn
http://JNoAMXgd.fpLqh.cn
http://GQKDSr0x.fpLqh.cn
http://PUI7zB8A.fpLqh.cn
http://l0aFXLRY.fpLqh.cn
http://s72NuRMQ.fpLqh.cn
http://lCi09iOp.fpLqh.cn
http://CQboAtTo.fpLqh.cn
http://xPDL48eY.fpLqh.cn
http://4ErNiVmb.fpLqh.cn
http://TE9RH8Wu.fpLqh.cn
http://tVvcV9t2.fpLqh.cn
http://kOUt3vv0.fpLqh.cn
http://w3aw1ovy.fpLqh.cn
http://0Maj0GU7.fpLqh.cn
http://U4s7x0E6.fpLqh.cn
http://nT5GuVuq.fpLqh.cn
http://gVg6Z37A.fpLqh.cn
http://5ENlCc69.fpLqh.cn
http://www.dtcms.com/a/374271.html

相关文章:

  • 英发睿能闯关上市:业绩波动明显,毅达创投退出,临场“移民”
  • 华清远见25072班网络编程day1
  • 深入理解 AbstractQueuedSynchronizer (AQS):Java 并发的排队管家
  • 32位CPU架构是如何完成两数(32位)相加的指令的?
  • 深度学习中的损失函数都有哪些,大模型时代主要用的损失函数有哪些,中间有什么区别?
  • java:io流相关类的继承关系梳理
  • PAT 1004 Counting Leaves
  • Linux操作系统shell脚本语言-第六章
  • 基于Springboot + vue3实现的小区物业管理系统
  • 自动化测试DroidRun
  • 把一段 JSON 字符串还原成一个实体对象
  • YOLO系列论文梳理(AI版)
  • ARM内核知识概念
  • 图论相关经典题目练习及详解
  • 深圳比斯特|多维度分选:圆柱电池品质管控的自动化解决方案
  • MySQL 日志全解析:Binlog/Redo/Undo 等 5 类关键日志的配置、作用与最佳实践
  • 龙虎榜——20250908
  • 自噬机制解析(二):一文厘清 LC3/Atg8 概念及实验应用要点
  • java类加载过程
  • 20250908-02:运行第一个 LLM 调用程序
  • 基于A2A和ADK的内容规划代理
  • 电流源电路
  • 随机获取数组内任意元素
  • ESNP LAB 笔记:配置MPLS(Part4)
  • 发布工业智能体,云从科技打造制造业AI“运营大脑”
  • Flask 博客系统(Flask Blog System)
  • Qt_UI界面的设计
  • pycharm 最新版上一次编辑位置
  • 【Pywinauto库】1. 3 Inspect.exe 使用详解指南
  • 「日拱一码」083 深度学习——残差网络