头图

如何把一个大象装进冰箱

首先打开冰箱门,然后把大象赶进去,最后,piaji,关上冰箱门 🐘

这样我们就收获了一只野生大象

装大象这样固定的三步走,和设计模式之模板方法是不是有点神似之处?

那么,模板方法到底给我们提供了什么样的编码技巧,什么场景下可以去使用模板方法,框架中有没有对模板方法的运用,真实的业务场景又是如何使用该设计模式的,你在这一文都可以得到解答。

目录

  • 定义
  • 样例解析
  • 业务运用
  • 框架运用

阅读本文约需 6 分钟 ✍️

定义

模板方法 作为一种行为型的设计模式,

本质是定义好了一个算法的框架,并且允许子类为其中的一个或多个步骤提供实现

可以在最大的程度不侵入子类的内部逻辑的情况下,重新定义算法步骤

适用场景就在于,可以一次性的实现一个算法的不变部分(打开冰箱门、关闭冰箱门),将可变的行为留给子类来实现(装大象🐘、装猴子🐒、装蚂蚁🐜)

该设计模式优点就在于可以提高代码的复用性、可扩展性、以及符合开闭原则,缺点就在于增加了系统的理解难度,以及是通过继承方式来实现的该设计模式,一旦增加了新的抽象方法,其他子类代码都得改一遍

听了这一大堆定义,是不是感觉云里雾里

接下来,我们回去那个大象的例子,你就可以理解

样例解析

我们先定义一个抽象类 ARefrigeratorHandle

去实现我们规定的开、放、关步骤

(这里会加入钩子方法,增加程序扩展性,具体可以看注释)

接下来,去实现放大象 PutElephant

接下来,去实现放猴子 PutMonkey (这里有钩子方法的具体运用)

可以观察到他们都去继承了 ARefrigeratorHandle 这个抽象类

万事具备,只欠测试

我们来写一下简陋的测试类

ok,测试通过,我们已经简单掌握了模板方法的运用,距离升职加薪只有一步了

业务运用

业务场景是这样的

在金融消费场景,用户还款后,我们需要及时将变更后的还款计划通知给对应的资金方

在我们系统设计中,还款计划是一套标准字段

七七八八的资金方所接受的还款计划字段又不一样

比如在我们的系统设计上计划期次叫做 planPeriod,可是 a 资金方叫做 plan-period, b 资金方 叫做 period

所以在我们推送前,需要对字段进行转换

整体步骤是 校验计划->转换字段->统一推送

框架运用

我们在 idea 中搜索 AbstractList 这么一个抽象类,并且很多的类都去实现了它,可以得知是为了扩展 List 用的

接下来,我们关注到 117 行,可以看到 get 的具体实现方法,都交由子类实现了,接下来看一下它的子类

 abstract public E get(int index);

可以观察到,我们熟悉的一个类 ArrayList

看一下 ArrayList 中的 get 方法

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

这就是 ArrayList 中对 get 的实现

当然你还可以观察到其他子类中 get 的实现

这就是一个简单的举例,大家还可以探索一下 HttpServletBaseExecutor 中对模板方法的运用


文章结束 🤣

如果本文对你有所帮助的话,那就点个赞吧

更多分享尽在 Skow 的微信公众号

公众号回复 “资料” 可以获取大厂面试题/技术文档/电子书等等


往期推荐

面试官竟然和我死磕 Maven


Issues
10 声望1 粉丝

热爱音乐,享受生活,希望分享可以帮助到有需要的人