最近,我让团队内一位成员写了一个导入功能。他使用了责任链模式,代码堆的非常多,bug 也多,没有达到我预期的效果。,实际上,针对导入功能,我认为模版方法更合适!为此,隔壁团队也拿出我们的案例,进行了集体 code review。,学好设计模式,且不要为了练习,强行使用!让原本 100 行就能实现的功能,写了 3000 行!对错暂且不论,我们先一起看看责任链设计模式吧!,责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。,
,责任链的使用场景还是比较多的:,如果不使用该设计模式,那么当需求有所改变时,就会使得代码臃肿或者难以维护,例如下面的例子。,反例,假设现在有一个闯关游戏,进入下一关的条件是上一关的分数要高于 xx:,那么代码可以这样写:,那么如果这个游戏有 100 关,我们的代码很可能就会写成这个样子:,这种代码不仅冗余,并且当我们要将某两关进行调整时会对代码非常大的改动,这种操作的风险是很高的,因此,该写法非常糟糕。,初步改造,如何解决这个问题,我们可以通过链表将每一关连接起来,形成责任链的方式,第一关通过后是第二关,第二关通过后是第三关....,这样客户端就不需要进行多重 if 的判断了:,缺点,现有模式的缺点:,每个关卡中都有下一关的成员变量并且是不一样的,形成链很不方便,代码的扩展性非常不好,责任链改造,既然每个关卡中都有下一关的成员变量并且是不一样的,那么我们可以在关卡上抽象出一个父类或者接口,然后每个具体的关卡去继承或者实现。,有了思路,我们先来简单介绍一下责任链设计模式的基本组成:,
,责任链工厂改造,对于上面的请求链,我们也可以把这个关系维护到配置文件中或者一个枚举中。我将使用枚举来教会大家怎么动态的配置请求链并且将每个请求者形成一条调用链。,
,设计模式有很多,责任链只是其中的一种,我觉得很有意思,非常值得一学。设计模式确实是一门艺术,仍需努力呀!
© 版权声明
文章版权归作者所有,未经允许请勿转载。