您的位置:首页 > 其它

观察者模式

2013-09-13 21:24 169 查看
  工作的时候看到前人写的代码中涉及到观察者模式,之前一直也想学以下这种模式,所以这次就对观察者模式的学习做下记录。

  观察者模式又称发布-订阅模式,说的通俗点,举个例子:我和朋友打dota,我玩lion,朋友玩小小,我对敌人放了技能妖术,然后我叫朋友放技能投掷,他放完了叫我放技能穿刺,我放完了地刺再叫他放技能山崩,他放完了以后再叫我放大招。这个例子里面多次用到了观察者模式的思路。我放完一个技能,然后通知我的朋友,这个过程中我就是被观察者,我朋友就是观察者,我释放玩技能,叫我朋友的动作就是通知;同理我朋友放完一个技能,然后通知我,这个时候他就是被观察者,我就是观察者。

  观察者的好处是不需要一直监控着某个对象。假如有100个线程在同一个资源被阻塞,如果不使用通知,那么这100个线程是不是要时刻监控着这个资源呢?每过一段时间查看一次这个资源是不是可以得到,这种监控对于计算机来说是种极大的浪费不是吗?现在的I/O资源,当写入成功或者读取成功的时候都会发出一个notify通知。来通知等待这个资源的线程。

  java中自己本身有实现一个标准的观察者模式,Observable(被观察对象的抽象),Observer(观察者的接口抽象),使用的话,被观察对象只需要继承Observable,观者者对象只需要实现Observer接口即可。观察者与被观察对象创建完以后只需要把观察者添加到被观察者对象中的vector容器即可。

  下面看下源代码,Observer:

package froest.obserpackege;

import java.util.Observable;
import java.util.Observer;

public class MyObserver2 implements Observer {

@Override
public void update(Observable o, Object arg) {
System.out.println("Observer2");
}

}


第二个观察者
被观察的对象更新了状态以后一定要调用setChanged方法,设置changed为true,在调用notifyObservers方法的时候会根据这changed值来判断是否需要更新。

  JDK支持的观察者模式,为了能够把具体的被观察者和观察者分离开来,抽象了具体的被观察者以及观察者,减少了两者之间的耦合性,但是有一点不足的是被观察者在调用update方法的时候,会把被观察者对象的this引用传递给观察者,那么在观察者这边可以实现对被观察者的状态的修改,如果是发布-订阅模式的话,这是不应该出现的,订阅方(也就是观察者)应该只有查看功能,根据被观察者的状态更新自己的行为,而不应该去修改观察者,所以JDK支持的观察者模式并不完全适用于发布-订阅模式,需要对update稍作修改,使得被观察者对于观察者是透明的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: