1
近些日子由于想要做一个日志分析的系统,而Spring MVC异常统一处理使用@ControllerAdvice+ @ ExceptionHandler 注解的方式是比较优秀的方式,因而,重新观看秦小波的设计模式之蝉,书中介绍的知识简单易懂,如有兴许的同学可以购买查看。

1 观察者模式:也叫发布订阅模式,定义对象之间的一种一对多的依赖关系,使得当每一个对象状态在改变,则,依赖它的对象都会得到通知并且自动更新。

2 角色解释

(1)subject被观察者:它必须能够动态的添加、取消观察者,它一般是抽象类或者实现类,仅仅通过完成作为被观察者必须实现的职责,管理观察者并通知观察者。
(2)Observer 观察者:观察者接受到消息之后,即进行update操作,对接受到的信息进行处理。

3 自己动手写观察者模式

(1)定义管理观察者的接口

clipboard.png

(2)定义被观察者的活动接口
  

clipboard.png

(3)被观察者的具体实现类

clipboard.png
clipboard.png

(4)定义观察者的接口

clipboard.png

(5)创建两个观察者具体实现类

clipboard.png

clipboard.png

(6)业务场景

clipboard.png

(7)运行结果

clipboard.png

至此,一个简单模式的观察者模式好了。

4 Jdk自带的观察者模式框架

(1)定义被观察者,继承 java.util.Observable

clipboard.png

(2)定义两个观察者

clipboard.png

clipboard.png

(3)业务场景类

clipboard.png

5 观察者模式的优缺点

(1)优点:观察者和被观察者之间是抽象的耦合,二是,有一套完整的触发机制

(2)缺点:观察者模式需要考虑一下性能问题,一个被观察者,多个观察者,开发和调试会相对比较复杂,而且Java中的消息的通知默认是按照顺序执行的,一个观察者卡壳,就会影响整体的执行效率。

6 项目中的观察者模式的使用场景的改造策略

(1)观察者和被观察者之间的消息沟通

被观察者状态会触发观察者的一个行为,同时会传递一个消息给观察者,在实际中的一般做法是:观察者中的update方法接受两个参数,一个是被观察者,一个是DTO,一个纯洁的DTO一般是一个JavaBean,由被观察者生成,有观察者消费。当然,如果是远程传输,一般的消息是XML格式进行传递。

(2)被观察者尽量自己做主

在设计的时候,尽量不让观察者进行逻辑处理,可以通过增加一个doSomething( boolean isNotifyObs)方法,决定是否通知观察者。


雨露
98 声望16 粉丝