从实况足球看责任链模式
程序员文章站
2022-04-22 16:40:04
...
如果你是一个足球迷,又喜欢玩一把游戏。那么你一定不会错过实况足球这款经典,无论是70,80,90,甚至00后,实况永远是我们青春的回忆。今年是实况足球发布第二十年,特别选了足球这个题材来讲解我想讲的这个特殊的模式。先贴图致敬经典吧。
足球是一项团队运动,一个队有11个人在比赛,这11个人各司其职。想要描述真实的足球比赛是异常复杂的,队员的能力,临场状态,阵型的安排,战术的布置,气候的影响都有可能影响比赛结果。
让我们把问题简单化,从队员职责的角度来分析足球。在实况足球里,一个队会有一个GK(守门员),至少一个CB(中卫),至少一个MF(中场),至少一个FW。
假设一次完整的进攻是由GK发起的,球从GK传到CB,CB再传给MF,MF传给FW,最后由FW完成最后的得分。当然真实的足球肯定没有这么简单,但抛开现实足球的复杂性,这条链路就是一条典型的责任链路。
让我们再加入一些更复杂一点的条件,使这条链路发生一些变化。
从上图可以看出,在链路上的队员没有发生变化的情况下,每个队员承担了更多的职责,并且可以根据不同的条件(接到球or not)选择do nothing(什么也不做)。什么也不做的真实含义是:我已经完成了责任(任务),下一个环节接上。
从上图还可以看出,足球是始终贯穿整个链路的一个载体(用技术的讲法叫上下文Context),正是由于足球的存在,队员才可以根据不同的条件选择做不同的事。
写到这里,其实还没有写到责任链的优点,让我们把话题转移到中超身上,大家都知道中超很多球队的打法非常简单,就是长传冲吊。至于为啥这么打这里就不吐槽了。简单地说,就是后卫一个大脚开到前场,让几个外援前锋嗷嗷地抢球射门。让我们把责任链简化一下。
从两幅图的对比可以看出以下不同点:
1、中超的CB责任发生了变化。
2、中超的责任链少了一个环节。
从两幅图的对比也可以看出以下相同点:
1、中超的GK责任没有发生变化。
2、中超的FW责任没有发生变化。
最后,让我们来总结一下责任链的特点:
1、责任链的每个环节都可以各司其职,相互独立。(GK, CB,MF,FW分工明确)
2、责任链的每个环节可以复用(比如中超的GK和FW就复用了外国的配置)
3、有一个上下文(Context)始终贯穿了整条责任链。(在这个例子中是足球)
4、责任链中有哪些环节可以自定义任意组合。(中超没有MF,就是任意组合的结果)
再来总结一下责任链的缺点:
1、链路过长,显得有些臃肿(明明足球可以直接从GK走到FW,但每一次都必须走完责任链的所有环节,哪怕某些环节什么也不做)
2、中间哪个环节什么也不做难以跟踪(当然上面的这个例子比较简单,难以描述这种情况,事实上过长的责任链会变得非常难以调试和跟踪。)
3、需要使用者对每个环节都非常了解才能灵活地任意组合责任链中的每个环节。(这也是它的一个很明显的缺点吧,最好是能有非常详细的文档来记录每个环节的作用,以方便不熟悉的使用者来查看)
版权声明:本文为博主原创文章,未经博主允许不得转载。
上一篇: HTML5基础知识
下一篇: 大数运算(2)——大数加法