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

来源:互联网 发布:魅族系统升级清除数据 编辑:程序博客网 时间:2024/05/17 22:56

责任链模式:

当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHander对象负责处理它。接收者和发送者都没有对方的明确信息,且链中的对象自己并不知道链的结构,在运行时自动确定。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用或指针,而不需要保持它所有的候选接受者。这也就大大降低了耦合度了。也就是说,我们可以随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。

状态模式:

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。即将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。这样做的目的是为了消除庞大的条件分支语句。状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
个人认为,职责链模式与状态模式的最大的不同是设置自己的下一级的问题上,状态模式是在类的设计阶段就定好的,不能在客户端改变,而职责链的下一级是在客户端自己来确定的。

总结:

状态模式:实际上子状态是从单个类中独立出去的,因此其整体的功能是一个完整的类的功能。只不过我们把这个类对不同情况的响应写在了一个类中,致使其扩展性不好。所以我们,才把它的不同响应行为独立成状态子类,以赋予它良好的对新需求的扩展性。其本质是,一个类对不同状态的多种不同响应。
职责链模式:实际上是在应对处理一个或者一类问题上的结构性优化。是多个管理者在处理一个问题上森严的等级关系。每个管理者,都只有能处理或者不能处理两种情况。那么,管理者或者说等级关系可能是不稳定的。职责链的本质是,不同的类对同一个问题的反应。
不同点:状态模式的子类只负责改变其拥有类的状态属性,而不负责去执行下一个状态的方法。执行还需要通过拥有他的类去调用下个状态子类的方法。而职责链模式的每个管理者则是既负责处理问题也负责请求的递交。这是,我觉得他们最大的区别。这两个模式是从一个问题的不同的角度的处理。一个从问题的角度,一个从处理者的角度。

0 0