首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

设计模式之模板方法模式(三分钟学会一个设计模式)

编程知识
2024年09月07日 14:44

模板方法模式(Template Method Pattern)也称之为模板模式(Template Pattern),是设计模式中最简单的模式之一。

先来看定义:
定义一个操作中算法的骨架(模板),将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重新定义算法某些特定的步骤。
这个定义还是有一些晦涩,我的理解是这样的:(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
在父类中我们可以定义一块业务的整体实现过程,但是针对某些步骤的具体实现逻辑,我们可以暂时先只定义一个抽象方法,在未来定义子类的过程中,实现/重写该方法。
这个模式主要是为了解决,很多场景中,我们并不知道未来实际使用中,具体需要怎么实现,甚至会出现多个具体实现,针对此,我们可以先定义父类中已经明确的业务。
大致的调用结构如下:

它是面向对象的23种设计模式中的一种,属于行为模式的范围。
来看示例代码:

音乐播放器抽象类

 1 package com.example.demo.learn.pattern.behavior.templatemethod;
 2 
 3 import lombok.extern.slf4j.Slf4j;
 4 
 5 /**
 6  * @discription
 7  */
 8 @Slf4j
 9 public abstract class AbstractMusicPlayer {
10     public void startUp() {
11         showFrame();
12         doCustomizedOpt();
13     }
14 
15     protected abstract void playWelcomeMsg();
16 
17     protected void showFrame() {
18         showMainFrame();
19         playWelcomeMsg();
20     }
21 
22     protected abstract void doCustomizedOpt();
23 
24 
25     protected abstract void showMainFrame();
26 }

酷猫播放器

 1 package com.example.demo.learn.pattern.behavior.templatemethod;
 2 
 3 import lombok.extern.slf4j.Slf4j;
 4 
 5 /**
 6  * @discription
 7  */
 8 @Slf4j
 9 public class CoolCatPlayer extends AbstractMusicPlayer{
10     @Override
11     protected void playWelcomeMsg() {
12       log.warn("hi man");
13     }
14 
15     @Override
16     protected void doCustomizedOpt() {
17         log.warn("您有一份价值99元的免费礼品待领取,快点击下方链接");
18     }
19 
20     @Override
21     protected void showMainFrame() {
22         log.warn("打开酷猫音乐主界面");
23     }
24 }

酷他音乐盒

 1 package com.example.demo.learn.pattern.behavior.templatemethod;
 2 
 3 import lombok.extern.slf4j.Slf4j;
 4 
 5 /**
 6  * @discription
 7  */
 8 @Slf4j
 9 public class CoolHePlayer extends AbstractMusicPlayer {
10     @Override
11     protected void playWelcomeMsg() {
12         log.warn("欢迎来到酷他音乐盒");
13     }
14 
15     @Override
16     protected void doCustomizedOpt() {
17         log.warn("一刀999,和兄弟一起战个痛快");
18     }
19 
20     @Override
21     protected void showMainFrame() {
22         log.warn("打开酷他音乐盒主界面");
23     }
24 }

执行主类

 1 package com.example.demo.learn.pattern.behavior.templatemethod;
 2 
 3 /**
 4  * @discription
 5  */
 6 
 7 public class PatternMain {
 8     public static void main(String[] args) {
 9         AbstractMusicPlayer coolCat = new CoolCatPlayer();
10         coolCat.startUp();
11 
12         AbstractMusicPlayer coolHe = new CoolHePlayer();
13         coolHe.startUp();
14     }
15 }

输出如下

15:38:12.515 [main] WARN com.example.demo.learn.pattern.behavior.templatemethod.CoolCatPlayer - 打开酷猫音乐主界面
15:38:12.518 [main] WARN com.example.demo.learn.pattern.behavior.templatemethod.CoolCatPlayer - hi man
15:38:12.518 [main] WARN com.example.demo.learn.pattern.behavior.templatemethod.CoolCatPlayer - 您有一份价值99元的免费礼品待领取,快点击下方链接
15:38:12.518 [main] WARN com.example.demo.learn.pattern.behavior.templatemethod.CoolHePlayer - 打开酷他音乐盒主界面
15:38:12.518 [main] WARN com.example.demo.learn.pattern.behavior.templatemethod.CoolHePlayer - 欢迎来到酷他音乐盒
15:38:12.518 [main] WARN com.example.demo.learn.pattern.behavior.templatemethod.CoolHePlayer - 一刀999,和兄弟一起战个痛快

我们定义了一个播放器的类,并且约定了播放器启动时,我们需要具体做的业务:

类图

步骤1、打开主界面

步骤2、做一些定制的用户操作
但是有多个播放器(如酷猫音乐、酷他音乐盒),他们的主界面和用户定制操作都各有不同,因此我们可以先只定义以上操作的抽象方法,对于具体操作的实现留给子类完成即可。

模板方法核心的步骤就是2点:
父类中定义骨架(模板),组织各种定义好的抽象方法
子类根据实际业务实现抽象方法

 

From:https://www.cnblogs.com/jilodream/p/18401753
本文地址: http://www.shuzixingkong.net/article/1809
0评论
提交 加载更多评论
其他文章 事务发件箱模式在 .NET 云原生开发中的应用(基于Aspire)
原文:Transactional Outbox in .NET Cloud Native Development via Aspire 作者:Oleksii Nikiforov 总览 这篇文章提供了使用 Aspire、DotNetCore.CAP、Azure Service Bus、Azure SQ
事务发件箱模式在 .NET 云原生开发中的应用(基于Aspire) 事务发件箱模式在 .NET 云原生开发中的应用(基于Aspire) 事务发件箱模式在 .NET 云原生开发中的应用(基于Aspire)
HashMap深入讲解
HashMap是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构, 而HashSet和HashMap者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说HashSet里面有一个HashMap(适配器模式)。因此了解HashMap源码也就了解HashSet了 介绍 K
HashMap深入讲解
真人模特失业?AI虚拟试衣一键成图,IDM-VTON下载介绍
在电商行业竞争尤为激烈的当下,除了打价格战外,如何有效的控制成本,是每个从业者都在思考的问题 IDM-VTON是一个AI虚拟换装工具,旨在帮助服装商家解决约拍模特导致的高昂成本问题,只需一张服装图片,就可以生成各种身穿该服装的模特,大大简化了传统的产品展示过程 IDM-VTON最新中文版: 百度网盘
真人模特失业?AI虚拟试衣一键成图,IDM-VTON下载介绍 真人模特失业?AI虚拟试衣一键成图,IDM-VTON下载介绍 真人模特失业?AI虚拟试衣一键成图,IDM-VTON下载介绍
[C#基础1/21] C#概述
Notion原笔记 1. C# 简介 1.1 C# 定义 C# 在继承 C 和 C++ 强大功能的同时去掉了一些它们的复杂特性,使其成为 C 语言家族中的一种高效强大的编程语言 1.2 C# 用途 用于捕获、分析和处理数据的业务应用程序 可从 Web 浏览器访问的动态 Web 应用程序 2D 和 3
跳跃表
概述 跳跃表(SkipList)是链表加多级索引组成的数据结构。链表的数据结构的查询复条度是 O(N)。为了提高查询效率,可以在链表上加多级索引来实现快速查询。跳跃表不仅能提高搜索性能。也能提高插入和删除操作的性能。索引的层数也叫作跳跃表的高度 查找 在跳跃表的结构中会首先从顶层开始查找,当顶层不存
跳跃表 跳跃表 跳跃表
Java是值传递还是引用传递,又是怎么体现的
关于Java是值传递还是引用传递,可以从代码层面来实现一下拿到结果 执行下面的代码: public static void main(String[] args) { int num = 10; String name = "Tom"; modify(num, name); Sy
五子棋AI:实现逻辑与相关背景探讨(下)
前文回顾 在上篇文章中,我们约定了一种衡量格子价值的方式,如下表。 综合价值排序 己方价值 敌方价值 对应的奖励数值 1 Lv1 ? \(2^{20}\) 2 ? Lv1 \(2^{16}\) 3 Lv2 ? \(2^{12}\) 4 ? Lv2 \(2^{8}\) 5 Lv3 ? \(2^{4}\
使用 `Roslyn` 分析器和修复器对.cs源代码添加头部注释
之前写过两篇关于Roslyn源生成器生成源代码的用例,今天使用Roslyn的代码修复器CodeFixProvider实现一个cs文件头部注释的功能, 代码修复器会同时涉及到CodeFixProvider和DiagnosticAnalyzer, 实现FileHeaderAnalyzer 首先我们知道修
使用 `Roslyn` 分析器和修复器对.cs源代码添加头部注释 使用 `Roslyn` 分析器和修复器对.cs源代码添加头部注释 使用 `Roslyn` 分析器和修复器对.cs源代码添加头部注释