从装大象中我们学会了什么设计模式
如何把一个大象装进冰箱
首先打开冰箱门,然后把大象赶进去,最后,piaji,关上冰箱门 🐘
这样我们就收获了一只野生大象
装大象这样固定的三步走,和设计模式之模板方法是不是有点神似之处?
那么,模板方法到底给我们提供了什么样的编码技巧,什么场景下可以去使用模板方法,框架中有没有对模板方法的运用,真实的业务场景又是如何使用该设计模式的,你在这一文都可以得到解答。
目录
定义
样例解析
业务运用
框架运用
阅读本文约需 6 分钟 ✍️
定义
模板方法 作为一种行为型的设计模式,
本质是定义好了一个算法的框架,并且允许子类为其中的一个或多个步骤提供实现
可以在最大的程度不侵入子类的内部逻辑的情况下,重新定义算法步骤
适用场景就在于,可以一次性的实现一个算法的不变部分(打开冰箱门、关闭冰箱门),将可变的行为留给子类来实现(装大象🐘、装猴子🐒、装蚂蚁🐜)
该设计模式优点就在于可以提高代码的复用性、可扩展性、以及符合开闭原则,缺点就在于增加了系统的理解难度,以及是通过继承方式来实现的该设计模式,一旦增加了新的抽象方法,其他子类代码都得改一遍
听了这一大堆定义,是不是感觉云里雾里
接下来,我们回去那个大象的例子,你就可以理解
样例解析
我们先定义一个抽象类 ARefrigeratorHandle
去实现我们规定的开、放、关步骤
(这里会加入钩子方法,增加程序扩展性,具体可以看注释)
接下来,去实现放大象 PutElephant
接下来,去实现放猴子 PutMonkey (这里有钩子方法的具体运用)
可以观察到他们都去继承了 ARefrigeratorHandle 这个抽象类
万事具备,只欠测试
我们来写一下简陋的测试类
ok,测试通过,我们已经简单掌握了模板方法的运用,距离升职加薪只有一步了
业务运用
业务场景是这样的
在金融消费场景,用户还款后,我们需要及时将变更后的还款计划通知给对应的资金方
在我们系统设计中,还款计划是一套标准字段
七七八八的资金方所接受的还款计划字段又不一样
比如在我们的系统设计上计划期次叫做 planPeriod,可是 a 资金方叫做 plan-period, b 资金方 叫做 period
所以在我们推送前,需要对字段进行转换
整体步骤是 校验计划->转换字段->统一推送
框架运用
我们在 idea 中搜索 AbstractList 这么一个抽象类,并且很多的类都去实现了它,可以得知是为了扩展 List 用的
接下来,我们关注到 117 行,可以看到 get 的具体实现方法,都交由子类实现了,接下来看一下它的子类
可以观察到,我们熟悉的一个类 ArrayList
看一下 ArrayList 中的 get 方法
这就是 ArrayList 中对 get 的实现
当然你还可以观察到其他子类中 get 的实现
这就是一个简单的举例,大家还可以探索一下 HttpServlet 、 BaseExecutor 中对模板方法的运用
文章结束 🤣
如果本文对你有所帮助的话,那就点个赞吧
更多分享尽在 Skow 的微信公众号
公众号回复 “资料” 可以获取大厂面试题/技术文档/电子书等等
版权声明: 本文为 InfoQ 作者【skow】的原创文章。
原文链接:【http://xie.infoq.cn/article/d9783d120b7456352fd82ccd6】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论