如何把一个大象装进冰箱
首先打开冰箱门,然后把大象赶进去,最后,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 的实现
这就是一个简单的举例,大家还可以探索一下 HttpServlet 、 BaseExecutor 中对模板方法的运用
文章结束 🤣
如果本文对你有所帮助的话,那就点个赞吧
更多分享尽在 Skow 的微信公众号
公众号回复 “资料” 可以获取大厂面试题/技术文档/电子书等等
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。