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

〇、小故事

不知道大家小时候都有什么难忘的经历。作为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

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

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

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

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

创建测试类: TemplateTest.java

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();
    }
}

运行结果:

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

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

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

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

相关推荐
sunbin8 分钟前
稀土掘金我要吐槽你
后端
程序员鱼皮2 小时前
我代表编程导航,向大家道歉!
前端·后端·程序员
间彧2 小时前
Spring Boot项目中如何实现Redis分布式锁
java
zjjuejin2 小时前
Maven 生命周期与插件机制
后端·maven
掘金安东尼2 小时前
AI 应用落地谈起 ,免费试用 Amazon Bedrock 的最佳时机
java·架构
阿杆2 小时前
为什么我建议你把自建 Redis 迁移到云上进行托管
redis·后端
杨杨杨大侠2 小时前
案例03-附件E-部署运维
java·docker·github
Java水解2 小时前
go语言教程(全网最全,持续更新补全)
后端·go
杨杨杨大侠2 小时前
案例03-附件B-映射器实现
java·开源·github
杨杨杨大侠2 小时前
案例03-附件A-订单实体设计
java·开源·github