趣解设计模式之《怀念小时候玩的红白机嘛?》

news2024/10/6 20:40:12

〇、小故事

不知道大家小时候都有什么难忘的经历。作为80后的我来说,小时候印象最深的就是任天堂生产的FC游戏机(俗称“红白机”),当时在家和小伙伴一起玩《魂斗罗》、《超级马里奥》、《冒险岛》、《坦克大战》等等游戏,经常从早上玩到天黑,然后作业都忘记写,被打屁股。

对于部分90后或者00后来说,红白机或许是比较陌生的。那这里我就说一下怎么去使用它玩游戏。具体步骤如下所示:

步骤1】把手柄连接到FC游戏主机上;
步骤2】把视频输出线连接到FC游戏主机和电视上;
步骤3】把电源适配器连接到FC游戏主机和电源插口上;
步骤4】把游戏卡带插入到FC游戏主机上;
步骤5】打开游戏开机按钮,快乐的游戏时光开始了!!

那如果我们想要换个游戏怎么办呢?只需要换个游戏卡带就可以了,so easy~ 对于需求的变化(我不要玩《魂斗罗》我要玩《超级马里奥》),我们不需要再重新执行一遍所有的5个步骤,只需要改变【步骤4】就可以了,那么这就是我们今天要介绍的——模版方法模式

一、模式定义

模版方法Template Method

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

为了便于大家对以上定义的理解,我们还是以玩FC游戏机为例,看一看哪些部分是“算法骨架”,哪些部分属于“延迟到子类实现”,具体请见下图所示:

二、模式类图

还是依照惯例,我们再举一个例子来理解一下这个设计模式。这个例子就是我们要制作一款饮品。那么,制作饮品的步骤我们暂且分为4个步骤:

步骤1】把水煮沸;
步骤2】制作饮品;
步骤3】把制作好的饮品放入到杯子中;
步骤4】往饮品中增加一些辅料;

那么,我们其实很容易的能够拆分出算法骨架——步骤1步骤3,那么需要延迟到子类中实现的自然就是——步骤2步骤4了,具体类图请见下图所示:

三、代码实现

我们创建模版方法抽象类:MakeBeverage.java

public abstract class MakeBeverage {
    // 准备食谱(防止子类覆盖这个方法)
    final void prepareRecipe() {
        /** 第一步:把水煮沸 */
        boilWater();
        /** 第二步:酿造饮品 */
        brew();
        /** 第三步:把饮品倒入杯子中 */
        pourInCup();
        /** 第四步:往饮品中增加调味品 */
        addCondiments();
    }

    // 制作饮品
    abstract void brew();

    // 往饮品中增加调味品
    abstract void addCondiments();

    protected void boilWater() {
        System.out.println("把水煮沸");
    }

    private void pourInCup() {
        System.out.println("把饮品倒入杯子中");
    }
}

创建模板方法的实现子类:Tea.java

public class Tea extends MakeBeverage {
    @Override
    protected void brew() {
        System.out.println("用沸水浸泡茶叶");
    }
    @Override
    protected void addCondiments() {
        System.out.println("往茶叶中添加柠檬");
    }
}

创建模板方法的实现子类:Coffee.java

public class Coffee extends MakeBeverage {
    @Override
    protected void brew() {
        System.out.println("用沸水冲泡咖啡");
    }
    @Override
    protected void addCondiments() {
        System.out.println("往咖啡中添加糖和牛奶");
    }
}

创建测试类:TemplateTest.java

public class TemplateTest {
    public static void main(String[] args) {
        System.out.println("-----------开始冲泡茶叶-----------");
        Tea tea = new Tea();
        tea.prepareRecipe();

        System.out.println("-----------开始冲泡咖啡-----------");
        Coffee coffee = new Coffee();
        coffee.prepareRecipe();
    }
}

运行结果:

-----------开始冲泡茶叶-----------
把水煮沸
用沸水浸泡茶叶
把饮品倒入杯子中
往茶叶中添加柠檬
-----------开始冲泡咖啡-----------
把水煮沸
用沸水冲泡咖啡
把饮品倒入杯子中
往咖啡中添加糖和牛奶

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1003334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

成果喜人 增速稳健丨Fortinet 谢青谈行业发展趋势与企业强劲增长驱动力

引言 随着时间进入到2023年第三季度末,Gartner、Forrester、ESG等全球权威咨询机构已相继发布Universal ZTNA、ZTE、OT安全等相关研究报告,2023年网络安全行业趋势渐趋明朗。同时,在这些相关报告中,作为创立二十余载,始…

leetcode 132. 分割回文串 II

2023.9.12 dp算法经典题之回文子串,先联想到 回文子串。 先用传统回文子串的dp方法定义一个二维数组存储该字符串的各子串是否为回文子串。 再定义一个一维dp数组用于存储下标0~i的最小分割次数。 初始化:先将该dp数组初始化为最坏情况,即下…

小米汽车进入生产调试冲刺阶段,雷军率队完成夏季新车路测

小米汽车通州生产基地即将进入生产调试冲刺阶段,小米集团董事长雷军率领小米汽车高层最近已经在新疆完成夏季新车路测,以争取在获得相关批文后尽快进入新车量产。 小米汽车的整个基地包括六个车间:压铸、冲压、车身、涂装、总装和电池。小米汽…

SpringBoot整合SSM-junit测试

前提 :创建一个新的springboot模块 创建一个员工案例(搭建) 创建员工实体类创建员工的控制层创建员工的服务层(接口–实现类)创建员工的数据层(接口–实现类) 以上的4种文件 是使用SSM必备的文件 创建员工实体类 属性…

vue3 element plus表格导出为excel自定义表头

新建一个out_excel.js文件并调用 import * as XLSX from "xlsx";export const exportToExcel (tableData, tableName, sheetName, fileName) > {const ws XLSX.utils.aoa_to_sheet([...[tableName], ...tableData]); // tableName为表头,tableData为…

【python自动化】Playwright基础教程定位操作

上文我们已经能够成功进行登录操作了。对于里面的一些定位方式,输入,点击等操作,在这一节,我们直接进行一个大汇总。以后遇到直接来这里搜。 定位操作 定位操作都在Page类下。养成看源码的习惯,结合官方文档&#xf…

这场科技巨变,有生之年有希望

见到一文,遂分享欲爆棚,总结如下。 具有人类水平的人工智能大约什么时候可以出现? 人类水平的人工智能,指的是,不需要借助人类,机器能够比人类更好地完成每项任务。 针对这个问题,有家机构在201…

Redis高效、安全的不停机数据迁移方案

Redis是目前最流行的键值对存储数据库,凭借高性能和丰富的数据类型的特性,不仅可以作为缓存,还可以作为一个可持久化的数据库存储。随着业务的发展和版本的迭代,必然会遇到内存不足、集群节点不够和BUG等一系列问题。为了防止这些…

四川百幕晟科技有限公司:抖音名称最多多少字?

在抖音上,用户可以为其帐户选择昵称,该昵称显示在用户的个人资料中。不过,很多人好奇,一个抖音昵称到底能有多少个字?本文将深入探讨抖音昵称长度限制以及一些最吸引人的昵称示例。 1、抖音昵称长度限制 抖音昵称的长度…

经典逝去,三方确认:iPhone15系列取消静音拨片,改用Action按钮

苹果公司将在9月13日凌晨1点举办秋季特别活动,这次活动将推出许多新产品,其中之一备受关注的是iPhone 15系列。在数月前,关于iPhone 15系列机型的消息早已传出,而最值得一提的变化就是取消自2007年初代iPhone发布以来一直存在的静…

【大数据环境安装】虚拟机安装操作

虚拟机安装操作 创建虚拟机 添加linux的iso镜像文件 开启虚拟机, 进行安装 正在校验, 可直接选择esc退出, 或者等待一会也是OK的 直到出现以下界面,开始选择语言: 结束后 , 点击重启, 然后进入系统, 到此, 虚拟机搭建工作结束 登录, 进入系统

【YOLOv 剪枝 轻量化】融合YOLOv5s与通道剪枝算法的奶牛轻量化个体识别方法(英文版含中文翻译)

融合YOLOv5s与通道剪枝算法的奶牛轻量化个体识别方法 Light-weight recognition network for dairy cows based on the fusion of YOLOv5s and channel pruning algorithm 论文链接知网链接 DOI链接 引用格式: 许兴时,王云飞,华志新&#xf…

全球汽车安全气囊芯片总体规模分析

安全气囊系统是一种被动安全性的保护系统,它与座椅安全带配合使用,可以为乘员提供有效的防撞保护。在汽车相撞时,汽车安全气囊可使头部受伤率减少25%,面部受伤率减少80%左右。 汽车安全气囊芯片是整个系统的控制核心,并…

中秋节包装礼盒样机|素材帮帮站

今天小编来给大家发福利了。中秋节临近,对中秋节礼盒样机愁眉苦展的宝子们看过来。 我们为您精心准备了各种款式、各种风格的中秋节包装礼盒样机素材54款【PSD源文件】,让您轻松打造独一无二的中秋礼盒。 部分效果图如下: 还有更多的素材等…

负载均衡-ribbon源码解析

负载均衡-ribbon源码解析 1 LoadBalanced注解 /*** 基于ribbon调用服务及负载均衡* return*/ LoadBalanced Bean public RestTemplate restTemplate(){return new RestTemplate(); }Bean ConditionalOnMissingBean public RestTemplateCustomizer restTemplateCustomizer(fin…

利用尾部网红的力量:跨境卖家的海外市场营销秘诀

随着互联网的不断发展,海外跨境电商已经成为全球贸易的重要一环。与此同时,社交媒体的兴起也催生了大批的海外网红,他们的粉丝群体庞大,有着巨大的市场潜力。然而,大部分跨境卖家都会集中在热门网红身上,而…

冠达管理:多场学术会议重启 医药板块行情回暖

9月11日,A股医药板块全天强势领涨,主力资金净流入超越50亿元,申万医药生物指数收涨2.62%。细分赛道中,中药、制药、立异药、瘦身药等板块领涨。个股方面,常山药业、金凯生科、通化金马、灵康药业等个股涨超10%。 音讯…

【月度刷题计划同款】从区间 DP 到卡特兰数

题目描述 这是 LeetCode 上的 「96. 不同的二叉搜索树」 ,难度为 「中等」。 Tag : 「树」、「二叉搜索树」、「动态规划」、「区间 DP」、「数学」、「卡特兰数」 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种…

Windows11系统下配置JAVA环境变量

一、环境变量的配置 1、右键开始菜单按钮,点击【系统➡高级系统设置】 2、在弹出的系统属性界面点击环境变量 3、在弹出的“环境变量”框,中选择下方的系统变量,点击新建 4、在弹出的“新建系统变量”框中,输入变量名和变量值&am…

vue中v-model应用于表单元素

v-model应用于表单元素 常见的表单元素都可以用v-model绑定关联→快速获取或设置 表单元素的值它会根据控件类型自动选取正确的方法来更新元素 常见的表单元素&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&…