状态模式和责任链模式的区别

555 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

1、状态模式是让各个状态对象自己知道其下一个处理的对象是谁,即在编译时便设定。相当于If ,else-if,else-if……, 设计思路是把逻辑判断转移到各个State类的内部实现(相当于If,else If),执行时客户端通过调用环境—Context类的方法来间接执行状态类的行为,客户端不直接和状态交互。

样例:状态模式(Java)

而职责链模式中的各个对象并不指定其下一个处理的对象到底是谁,只有在客户端才设定某个类型的链条,请求发出后穿越链条,直到被某个职责类处理或者链条结束。本质相当于swich-case,设计思路是把各个业务逻辑判断封装到不同职责类,且携带下一个职责的对应引用,但不像状态模式那样需要明确知道这个引用指向谁,而是在环境类设置链接方式或者过程。使用时,向链的第一个子类的执行方法传递参数就可以。客户端去通过环境类调用责任链,全自动运转起来。

样例:责任链模式(Java)

2、状态模式的子类只负责改变其拥有类的状态属性,而不负责去执行下一个状态的方法,执行还需要通过拥有他的类去调用下个状态子类的方法。

而职责链模式的每个管理者则是既负责处理问题也负责请求的递交。


针对具体业务,有人用状态模式,从头到尾提前定义好下一个处理的对象,有人采用责任链,随时都有可能调整链的顺序。