观察者模式

来源:互联网 发布:mac修改mysql登录密码 编辑:程序博客网 时间:2024/06/04 01:14

最近在看headfirst设计模式,特别记录下自己的理解

什么是观察者模式呢?

我的理解是在该模式中至少有一个subject(主题)作为被观察者(Observable),一个或者多个对该主题感兴趣的观察者(observer)注册到该主题上,每当主题状态有所改变,subject负责通知到注册的观察者对象我的状态改变咯,具体的业务逻辑怎么改变就是观察者自己的事情了。

以上也可以看出其它的一些内容:

1、subject能够知晓有那些观察者对象,但是对于每个观察者对象具体的内部执行就不清楚了。

2、注册--通知的模式,对于观察者和被观察者来说,状态改变数据的传递到底是由被观察者推数据还是由观察者来拉数据,也是可以根据实际的业务情况和代码来确定。

简单的画了个图来帮助理解




观察者模式java实现

1、自己实现简单示例
主题接口  提供了注册、删除以及通知观察者的方法


观察者接口 提供了观察者自身接收到状态变更通知的更新操作方法



具体的主题对象实现了Subject
实现了对注册、移除和通知的具体实现




具体实现的观察者对象,ConcreteObserver2和3都差不多,就不贴了




写下简单的测试程序,运行下看下打印的信息,可以看到主题的状态改变之后,对之感兴趣的观察者也会收到相应的通知,执行自己相应的逻辑





2、java jdk实现示例

JDK中为了方便开发人员,已经写好了现成的观察者接口和被观察者类。
a、观察者实现观察者接口(java.uitl.Observer),调用

图就不画了,直接上个修改之后的代码来示例吧
新的具体主题类



新的观察者类1,类2和类3相似,就不贴代码了



再次运行main方法,看下结果




可以看到运行之后的输出内容和我们之前自己写的代码输出是不一致的。因为Observable自己实现了自己的notifyObservers方法,不清楚的童鞋可以自己看下jdk的源码

所以我们的代码不能有依赖于次序,不然就会出现问题,这个是个坑,小心咯。


3、那用观察者模式有什么好处或者问题

交互对象之间的松耦合。对于观察者来说,可能后续会有新的观察者加入或者离开,这都不影响主题或者被观察者的逻辑。主题或被观察者状态变化之后,也能立即让对该状态感兴趣的观察者接收到通知。

观察者可以从被观察者处选择是推数据还是自己去拉数据


那问题呢

一个是如果使用jdk的实现,多个观察者不能依赖特定的通知次序

一个是如果使用主题继承Observable抽象类时,代码的灵活性会受到一些影响。毕竟java是不支持多继承的。


好吧,这次文章就先到这里吧