Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式【13】-- 模板模式怎么弄?

设计模式【13】-- 模板模式怎么弄?

作者头像
秦怀杂货店
发布于 2022-02-15 06:44:28
发布于 2022-02-15 06:44:28
1.3K00
代码可运行
举报
文章被收录于专栏:技术杂货店技术杂货店
运行总次数:0
代码可运行

Part0前言

剑指Offer & LeetCode刷题仓库https://github.com/Damaer/CodeSolution 文档地址https://damaer.github.io/CodeSolution/ 刷题仓库介绍刷题仓库:CodeSolution 编程知识库https://github.com/Damaer/Coding 文档地址https://damaer.github.io/Coding/#/ 剑指OfferV2 系列已经完成,补增 V2 题目以及C++语言解法,发送 剑指Offer 可获取pdf

设计模式

开局还是那种图,各位客官往下看...

张无忌学太极拳,忘记了所有招式,打倒了"玄冥二老",所谓"心中无招"。设计模式可谓招数,如果先学通了各种模式,又忘掉了所有模式而随心所欲,可谓OO之最高境界。

1模板模式是什么?

模板模式,同样是一种行为型模式,也就是关于对象做什么或者怎么做的设计模式。模板模式的本质需要定义操作中的算法的框架,但是有一些步骤,又不需要具体的实现,而是不同的子类各自实现。子类不能修改流程框架,但是部分的步骤可以做定制化的实现。

主要要解决一个问题:一些通用的方法,但是每一个子类却都重新写,冗余。

比如说,做菜的步骤一般是:洗锅 --> 炒菜 --> 洗碗 ,不同的菜,只是炒菜这一个步骤具体细节是不同的,但是其他步骤确实几乎一模一样的,这样其实整体框架,以及重复的步骤,我们可以抽象到模板中,而不同的细节方法可以开放给每一种菜(具体实现)去定制。

又比如造房子的时候,很多地方的建造都是一样的:地基,墙壁,水管等等,但是不同的房子里面的内部的设计又有所不同。

2不使用模板模式

就挑个简单的例子“炒菜”,如果不使用模板模式的话,糖醋鲤鱼:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

public class SweetAndSourCarp {

    public void cookFood(){
        washPan();
        cook();
        eat();
        washDishes();
        System.out.println("");
    }

    private void washPan(){
        System.out.print("洗锅 --> ");
    }

    private void cook(){
        System.out.print("煮糖醋鲤鱼 --> ");
    }

    private void eat(){
        System.out.print("吃饭 --> ");
    }

    private void washDishes(){
        System.out.print("洗碗 --> ");
    }
}

再弄一个农家小炒肉,需要写很多相同的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ShreddedPorkWithVegetables {

    public void cookFood(){
        washPan();
        cook();
        eat();
        washDishes();
        System.out.println("");
    }

    private void washPan(){
        System.out.print("洗锅 --> ");
    }

    private void cook(){
        System.out.print("炒农家小炒肉 --> ");
    }

    private void eat(){
        System.out.print("吃饭 --> ");
    }

    private void washDishes(){
        System.out.print("洗碗 --> ");
    }
}

测试类如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        SweetAndSourCarp sweetAndSourCarp = new SweetAndSourCarp();
        sweetAndSourCarp.cookFood();

        ShreddedPorkWithVegetables shreddedPorkWithVegetables = new ShreddedPorkWithVegetables();
        shreddedPorkWithVegetables.cookFood();
    }
}

测试结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
洗锅 --> 煮糖醋鲤鱼 --> 吃饭 --> 洗碗 --> 
洗锅 --> 炒农家小炒肉 --> 吃饭 --> 洗碗 -->

可以看到,整体流程是一样的,有些步骤一样,有些步骤不一样,但是不使用模板模式,需要每个类都重写一遍方法,即使是通用方法,整个流程都需要自己写一遍。

3使用模板模式优化

如果使用模板模式,那么我们会抽象出一个抽象类,定义整体的流程,已经固定的步骤,开放需要定制的方法,让具体的实现类按照自己的需求来定制。

定义的抽象类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class CookFood {
    public final void cookFood() {
        washPan();
        cook();
        eat();
        washDishes();
        System.out.println("");
    }

    private final void washPan() {
        System.out.print("洗锅 --> ");
    }

    public abstract void cook();

    private final void eat() {
        System.out.print("吃饭 --> ");
    }

    private final void washDishes() {
        System.out.print("洗碗 --> ");
    }
}

具体的实现类糖醋鲤鱼:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SweetAndSourCarp extends CookFood {
    @Override
    public void cook() {
        System.out.print("煮糖醋鲤鱼 --> ");
    }
}

农家小炒肉:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ShreddedPorkWithVegetables extends CookFood {
    @Override
    public void cook() {
        System.out.print("炒农家小炒肉 --> ");
    }
}

测试类与前面的一样,测试结果也一样,这里不再重复。

上面的方法中,其实我们只开放了cook()方法,这就是钩子方法

在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为 ”钩子方法”

钩子方法是开放的,可以由子类随意覆盖,但是像上面的其他方法,我们不希望子类重写或者覆盖它,就可以用 final 关键字,防止子类重写模板方法。

4模板模式的应用

其实在 JDKThread 实现中,就是使用了模板模式,我们知道创建线程有两个方式:

  • 创建 Thread
  • 实现 runnable 接口

我们实现的一般是 run() 方法, 但是调用的却是 start() 方法来启动线程,这个原因就是 start() 方法里面帮我们调用了run()方法, run()方法是开发的方法,我们可以覆盖重写它。

Start0()是一个native方法,是由 c 语言去实现的,在调用的时候,真正调用了我们的 run() 方法,如果需要跟踪这个方法需要到 HotSpot底层去。这里介绍的目的是让大家了解,它同样是使用了模板模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private native void start0();

了解 native 关键字可以参考:native关键字到底是什么东西?

5模板模式的优缺点

模板模式的优点:

  • 1、封装固定的部分,拓展需要定制修改的部分,符合开闭原则。
  • 2、公共的代码在父类中,容易维护。
  • 3、整个流程由父类把握,调整比较方便。

缺点:

  • 1、子类可能会很多,系统复杂度上升。
  • 2、子类只有一小部分实现,了解全部方法则需要在父类中阅读,影响代码阅读。

总结:代码该隐藏的复杂细节隐藏起来,开放定制化部分,优雅!

设计模式系列

【作者简介】

秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人网站:http://aphysia.cn ,关注我,我们一起成长吧~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秦怀杂货店 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
EdgeX Foundry:边缘计算的未来趋势与应用
摘要: 本文探讨了 EdgeX Foundry 在应对边缘计算需求方面的关键特性和优势,包括协议对接、边缘侧分析、持续改进、差异化增值服务以及资源最大化利用。同时,还介绍了其在不同场景下的灵活部署方式。
程序员阿伟
2024/12/09
2370
边缘计算开源平台
边缘计算中的边缘(edge)指的是网络边缘上的计算和存储资源,这里的网络边缘与数据中心相对,无论是从地理距离还是网络距离上来看都更贴近用户。作为一种新的计算范式,边缘计算将计算任务部署于接近数据产生源的网络边缘,利用边缘资源为用户提供大量服务或功能接口,大大减少上传至云数据中心的数据量,缓解网络带宽压力,同时可以更好地解决数据安全和隐私问题。
边缘计算
2019/07/21
3.3K0
边缘计算开源平台
云边端与边缘计算技术「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。 云边端与边缘计算技术 边缘计算,是指在靠近物或数据源头的一侧,采用网络、计算、存储、应用核心能力为一体的开放平台,就近提供最近端服务。其应用程序在边缘侧发起,产生更快的网络服务响应,满足行业在实时业务、应用智能、安全与隐私保护等方面的基本需求。边缘计算处于物理实体和工业连接之间,或处于物理实体的顶端。而云端计算,仍然可以访问边缘计算的历史数据。 边缘计算并非是一个新鲜词。作为一家内容分发网络CDN和云服务的提供商AKAMAI,早在2003年就与IBM合作“
全栈程序员站长
2022/06/25
3.5K0
云边端与边缘计算技术「建议收藏」
基于边缘计算平台的分析与研究
摘 要:边缘计算作为万物互联时代的关键技术,具有广泛的应用场景。文章首先分析了边缘计算平台在推广中面临的问题;随后从架构出发分析了典型边缘计算平台,并列举了边缘计算应用场景的需求参数,最后提出了一种边缘计算平台分类模型。
边缘计算
2019/09/04
1.8K0
基于边缘计算平台的分析与研究
边缘计算(三)——边缘计算的解决方案
目前,市场上存在的边缘计算相关概念包括雾计算、边缘计算、多接入边缘计算/移动边缘计算、移动云计算等概念。这是边缘计算的第三篇,主要讲的内容是边缘计算的解决方案。
大数据和云计算技术
2019/03/07
4.3K0
边缘计算(三)——边缘计算的解决方案
2022十大边缘计算开源项目
随着“开源”被纳入“十四五”规划发展纲要,“支持数字技术开源社区等创新联合体发展,完善开源知识产权和法律体系,鼓励企业开放软件源代码、硬件设计和应用服务”。开源发展按下了加速键!
边缘计算
2023/02/23
1.9K0
2022十大边缘计算开源项目
LF EdgeX Foundry为IoT启用边缘计算
Linux基金会推出了EdgeX Foundry,该项目旨在为物联网计算和可互操作组件生态系统建立开放框架。 EdgeX Foundry旨在促进边缘计算的模式,其中启用的设备将不会将其数据发送回云进行处理,而是依靠本地网关设备进行计算和分析。这种方法的主要优点是减少了延迟和网络流量,并提高了安全性。对于不需要云组件的发电,智能交通灯等工业应用,这被认为是特殊的价值。或者,对于来自多个设备的数据在将其发送到云之前本地收集的更一般的应用。 根据该公告,戴尔将根据Apache 2.0许可协议贡献其Fuse框架的源
架构师研究会
2018/04/09
1K0
LF EdgeX Foundry为IoT启用边缘计算
【愚公系列】软考高级-架构设计师 115-边缘计算
边缘计算(Edge Computing)是一种分布式计算范式,旨在将数据处理和存储功能从传统的集中式数据中心转移到距离数据生成源头更近的边缘设备或边缘节点上进行处理。边缘计算的主要目的是在接近数据生成源头的位置提供更快速的数据处理、减少数据传输延迟,以及降低网络流量和数据中心负载。
愚公搬代码
2024/08/18
3710
看开源大咖化解边缘计算,开启万物互联秘钥之旅
“相对于传统电信行业标准化工作的严谨与谨慎,开源社区的工作方式更加开放与灵活。在推动 5G 产业快速成熟方面,二者存在很大的互补性和合作空间。“
CNCF
2019/12/04
9990
看开源大咖化解边缘计算,开启万物互联秘钥之旅
IDC解读边缘计算新趋势,研华如何把握机遇?
IDC报告指出,边缘计算与AI融合引领工业变革,预计中国现场级边缘算力设备市场持续扩展。研华凭借全栈Edge AI解决方案,积极推动智能化转型,助力全球行业实现数字化升级。
研华科技
2025/03/13
1860
IDC解读边缘计算新趋势,研华如何把握机遇?
盘点丨2019十大边缘计算项目
5G和物联网让边缘计算备受瞩目,巨头们纷纷跑步入场,边缘计算项目百花齐放,参差不齐。边缘计算社区经过1个月收集,梳理了10个2019年表现优异的边缘计算开源项目、边缘计算框架及边缘计算平台,以下排名不分先后。
边缘计算
2020/01/17
1.5K0
盘点丨2019十大边缘计算项目
未来网络技术的新征程:5G、物联网与边缘计算(10/10)
边缘计算最早可以追溯到 1998 年 Akamai 公司提出的内容分发网络(content delivery network,CDN),其目的是为了降低网络拥塞,提高用户访问响应速度和命中率。边缘计算处于物理实体和工业连接之间,或处于物理实体的顶端,其应用程序在边缘侧发起,产生更快的网络服务响应,满足行业在实时业务、应用智能、安全与隐私保护等方面的基本需求。
正在走向自律
2024/12/18
3650
未来网络技术的新征程:5G、物联网与边缘计算(10/10)
边缘计算与云计算是什么关系
本文介绍了边缘计算的概念、应用场景、技术特性以及与其他技术的结合,并分析了边缘计算在电信运营商、智能制造等领域的应用案例。
云计算爱好者
2018/01/03
5.1K0
下一次 IT 变革:边缘计算(Edge computing)
摘要:外媒 ZDnet 发布了此篇边缘计算领域的重要文章,详细分析了各机构不同的定义、市场状况、前景等,经编译,供各位参考
钱塘数据
2019/03/08
1.1K0
下一次 IT 变革:边缘计算(Edge computing)
浅析边缘计算的概念、架构、应用与实战
随着物联网、5G、人工智能等技术的快速发展,边缘计算作为一种新兴的计算模式,正逐渐从理论走向现实,成为推动数字化转型的关键力量。本文将深入探讨边缘计算的概念、架构特点、典型应用场景,并结合实战代码示例,系统地向读者呈现一幅完整的边缘计算技术图景。最后,本文将基于当前行业动态,对边缘计算的未来发展趋势及挑战发表笔者的观点与评价。
zhouzhou的奇妙编程
2024/04/22
3K0
盘点:2022年值得关注的十大边缘计算开源项目
根据IDC最新的「全球边缘计算支出报告」指出,到2022 年,全球在边缘计算上的支出预计将达到1760 亿美元,比2021 年增长14.8%。企业和服务提供商在边缘解决方案的硬体、软体和服务上的支出预计将在2025 年达到近2740 亿美元。 本文盘点了2022年值得关注的十大边缘计算开源项目(排名不分先后)。 Akraino Akraino 于 2018 年推出,现在是 LF Edge 的一部分。Akraino 是一组面向边缘的开放基础架构和应用程序蓝图,涵盖了供应商和企业边缘域的5G,AI,Edge
SDNLAB
2022/03/04
2.1K0
将Edgex网关接入Thingsboard物联网平台
系统环境准备Thingsboard物联网平台平台概述安装概述Edgex foundry开源边缘计算物联网软件框架将Edgex网关接入Thingsboard物联网平台的关键组件eKuiper安装确认推荐安装eKuiper 管理控制台将 Edgex 设备数据上报关键步骤主要步骤Thingsboard平台建立网关创建 EdgeX 流并建立规则登录eKuiper 管理控制台添加docker内的 eKuiper 规则引擎建立规则,发送物联网平台物联网遥测上传API参考说明
物联网低代码平台的价值
2021/12/24
3.7K1
将Edgex网关接入Thingsboard物联网平台
EMQ 边缘计算领域又一里程碑!Kuiper 正式加入 LF Edge 基金会
近日,经 LF Edge 委员会投票决议,EMQ 旗下的开源项目 EMQ X Kuiper(以下简称 Kuiper)作为「Stage 1 - At Large」正式加入 LF Edge 基金会。
边缘计算
2021/07/01
1.1K0
EMQ 边缘计算领域又一里程碑!Kuiper 正式加入 LF Edge 基金会
多领域赋能,边缘计算引领行业智能化转型
边缘计算,简而言之,是在数据产生的源头或附近进行数据处理的技术。其核心优势在于实现数据的本地化处理,从而显著降低延迟并减少带宽需求。相较于云计算,边缘计算能提供更实时的数据处理能力,避免了将大量原始数据远距离传输至云数据中心的过程,极大节省了资源和时间。
GPUS Lady
2024/08/06
2810
互联网十万个为什么之什么是边缘计算?
边缘计算是一种计算模式,目的在于把数据处理的位置从远程集中的数据中心或云迁移到靠近数据源的地方,如用户设备或传感器附近。这种方式通过在网络的边缘处理信息,可以有效应对数据量增长和网络容量限制所带来的挑战。边缘计算通过近源处理,大幅减少了数据传输时间,降低了网络拥塞和服务延迟,同时实现了对带宽的经济性利用和更快的决策反馈,优化了整体应用性能,加强了数据处理的即时性和安全性。
linus_lin
2024/09/26
1830
互联网十万个为什么之什么是边缘计算?
相关推荐
EdgeX Foundry:边缘计算的未来趋势与应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验