写点什么

从装大象中我们学会了什么设计模式

用户头像
skow
关注
发布于: 2021 年 07 月 12 日
从装大象中我们学会了什么设计模式

如何把一个大象装进冰箱

首先打开冰箱门,然后把大象赶进去,最后,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 的微信公众号


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



发布于: 2021 年 07 月 12 日阅读数: 12
用户头像

skow

关注

分享,前方就是一片花海 2019.05.30 加入

微信公众号:codeLiveHouse

评论

发布
暂无评论
从装大象中我们学会了什么设计模式