观察模式
观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式)是软件设计模式的一种。
在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。
此种模式通常被用来实作事件处理系统。
简单点概括成通俗的话来说,就是一个类管理着所有依赖于它的观察者类,并且它状态变化时会主动给这些依赖它的类发出通知。
我们的被观察者类Observable只关联了一个Observer的列表,然后在自己状态变化时,使用notifyObservers方法通知这些Observer,具体这些Observer都是什么,被观察者是不关心也不需要知道的。
一对多的方法,当一个对象的状态发生改变,那么依赖这个状态的相应对象都会发生改变。
目标与观察者的关系,可以多目标一个观察者,也可以多个观察者一个目标
单向依赖:只有目标什么更新观察者
命名:目标subject,观察者observer,更新方法update
触发通知的时机:先设置值再更新
观察者实现的顺序:
通知顺序:顺序不确定
推模型和拉模型
推模型:
目标对象主动向观察者推送目标的详细信息,推送的信息通常是目标对象的全部或者部分数据,广播方式,在update方法中传递的是定制的内容
拉模型:
目标对象在通知观察着的时候,只传递少量信息
如果观察者需要更具体的信息,有观察者主动到目标对象中去获取,相当于观察者从目标对象中拉数据
一般这种模型的实现中,会把目标对象自身通过update方法传递给观察者
比较:
推模型假定目标是知道自己想要什么的,因此update中传递的是定制的值,同时这样做会使得代码难以复用
拉模型是目标对象不知道自己想要什么值,因此要把对象本身给观察者,由观察者来取值
java中对观察者模式的实现
由于JDK中为了方便开发人员,已经写好了现成的观察者接口和被观察者类
观察者接口。
被观察者类
点评
观察者和目标之间是松耦合;观察者实现了动态联动;观察者支持广播通信
可能会引起无谓的操作
何时使用观察者模式
http://www.runoob.com/design-pattern/observer-pattern.html
http://www.cnblogs.com/zuoxiaolong/p/pattern7.html
http://www.cnblogs.com/fingerboy/p/6393644.html
http://abc08010051.iteye.com/blog/1972960
回调函数
http://www.cnblogs.com/heshuchao/p/5376298.html
https://www.zhihu.com/question/19801131
http://blog.csdn.net/xiaanming/article/details/8703708
事件监听
https://my.oschina.net/u/923324/blog/792857
责任链模式
责任链模式是一种对象的行为模式。
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
实现
责任链模式涉及到的角色如下所示:
抽象处理者(Handler)角色:定义一个处理请求的抽象类。如果需要,可以定义一个方法以设定和返回对下家的引用。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。
点评
不用职责链的结构,我们需要和公司中的每一个层级都发生耦合关系。
如果反映在代码上即使我们需要在一个类中去写上很多丑陋的if….else语句。
如果用了职责链,相当于我们面对的是一个黑箱,我们只需要认识其中的一个部门,然后让黑箱内部去负责传递就好了
缺点:构造大量的对象,但是最终只有一个对象响应请求,因此内存中的性能会有所损耗,可以使用观察者模式代替
还有就是责任链必须遍历整条链才能找到响应,比较耗时
应用:异常处理,filter(多个filter可以响应,不止是一个)
http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html
http://blog.csdn.net/zuoxiaolong8810/article/category/1434962/2