若您对我的分享感兴趣可以访问:java设计模式专栏
在常用的23中设计模式中,有三种模式容易混淆,这三种模式分别是:责任链模式、状态模式以及策略模式
因此接下来我们把这三种模式放在一起讨论
1、责任链模式(okHttp)责任链模式在安卓系统中也有比较典型的实践,例如 view 系统对点击事件(TouchEvent)的处理
状态模式目的or意图:
控制一个对象内部的状态转换的条件表达式过于复杂时的情况,且客户端调用之前不需要了解具体状态。它把状态的判断逻辑转到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化
其本质是:一个类对不同状态的多种不同响应
关键:
状态模式是让各个状态对象自己知道其下一个处理的对象是谁!即在状态子类编译时在代码上就设定好了!
https://www.cnblogs.com/kubixuesheng/p/5180509.html
状态模式和责任链模式的比较:
区别在于状态模式需要各个状态类(类比责任链上的各个职责类),明确知道自己的下一个需要转移的状态是什么,而责任链模式里的责任类不需要知道自己的下一个需要转移的职责是哪个,等价于——发出完成某任务请求的客户端并不知道链上的哪一个对象最终处理这个请求,这个组装过程需要交给环境类去完成
重点:(最重要的区别)
状态模式需要各个状态类,明确知道自己的下一个需要转移的状态是什么,所有的状态类一起组装了请求的处理逻辑
责任链模式上的责任类,不需要不需要知道自己的下一个需要转移的职责是哪个,这个组装过程需要交给环境类去完成
比如,政府部分的某项工作,县政府先完成自己能处理的部分,不能处理的部分交给省政府,省政府再完成自己职责范围内的部分,不能处理的部分交给中央政府,中央政府最后完成该项工作。但是以上的责任的转移,或者说在责任链上的移动,各个责任类不知道具体顺序和下一个责任,链条的组装过程是环境类(或客户端完成的)
一般来说责任链重要的是环境类,通过环境类其指定各个责任类的执行顺序,非常灵活
每个责任类只需要完成自己的工作其他的不需要考虑
但是还有一种写法是责任链也是可以指定下一个责任类,那么这个时候区分两种模式的就要使用终极大杀器了
需要注意的是:状态模式出现的根本原因是需要对自身的状态进行改变
而责任链模式是对一个事件的处理
极大程度简化了这些操作
状态模式和策略模式的比较
实现目的不一样!
首先知道,策略模式是一个接口的应用案例,一个很重要的设计模式,简单易用,策略模式一般用于单个算法的替换,客户端事先必须知道所有的可替换策略,由客户端去指定环境类需要哪个策略,注意通常都只有一个最恰当的策略(算法)被选择。其他策略是同级的,可互相动态的在运行中替换原有策略,(注意关键是策略模式需要客户端了解策略)
而状态模式的每个状态子类中需要包含环境类(Context)中的所有方法的具体实现——条件语句,通过把行为和行为对应的逻辑包装到状态类里,在环境类里消除大量的逻辑判断,而不同状态的切换由继承(实现)State的状态子类去实现,当发现修改的当前对象的状态不是自己这个状态所对应的参数,则各个状态子类自己给Context类切换状态(有职责链模式思想)!
且客户端不直接和状态类交互,客户端不需要了解状态!(和策略不一样),策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作,客户端需要了解策略!
联系:
状态模式和策略模式都是为具有多种可能情形设计的模式,把不同的处理情形抽象为一个相同的接口(抽象类),符合对开闭原则,且策略模式更具有一般性,在实践中,可以用策略模式来封装几乎任何类型的规则,只要在分析过程中听到需要在不同实践应用不同的业务规则,就可以考虑使用策略模式处理,在这点上策略模式是包含状态模式的功能的。