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

〇、小故事

不知道大家小时候都有什么难忘的经历。作为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^)/ ~ 「干货分享,每天更新」

相关推荐
ps酷教程1 天前
HttpPostRequestDecoder源码浅析
java·http·netty
闲人编程1 天前
消息通知系统实现:构建高可用、可扩展的企业级通知服务
java·服务器·网络·python·消息队列·异步处理·分发器
栈与堆1 天前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
superman超哥1 天前
双端迭代器(DoubleEndedIterator):Rust双向遍历的优雅实现
开发语言·后端·rust·双端迭代器·rust双向遍历
1二山似1 天前
crmeb多商户启动swoole时报‘加密文件丢失’
后端·swoole
马卡巴卡1 天前
Java CompletableFuture 接口与原理详解
后端
OC溥哥9991 天前
Paper MinecraftV3.0重大更新(下界更新)我的世界C++2D版本隆重推出,拷贝即玩!
java·c++·算法
星火开发设计1 天前
C++ map 全面解析与实战指南
java·数据结构·c++·学习·算法·map·知识
*才华有限公司*1 天前
RTSP视频流播放系统
java·git·websocket·网络协议·信息与通信
神奇小汤圆1 天前
Java线程协作工具:CountDownLatch 、CyclicBarrier、Phaser、Semaphore 、Exchanger
后端