引用一下某大的文章:
用户通常通过调用对象的方法来收集该对象的信息。但是当这个对象发生变化的时候,就会出现这样的一个问题:依赖该对象的用户如何才能知道对象的信息已经发生了变化?
我们可能通过这样一种设计:创建一个对象,每当用户所关心的对象某个方面发生变化的时候,该对象负责通知相关对此消息感兴趣的用户。这种设计的问题 在于只有用户自己才知道他关心的某对象的哪些方面,因而这个受关注的对象不应当承担这种通知用户的责任。解决方法之一就是:在受关注的对象收到信息之后, 通知用户,然后由用户去查询对象的新状态。
Observer模式的意图就是在多个对象之间定义一个一对多的关系,以便当一个对象状态改变的时候,其他所有依赖于这个对象的对象都能够得到通知,并被自动更新。
1.例子
JE 上的订阅采用的就是这个观察者模式 了,我们可以订阅我们所感兴趣的用户A。当用户A更新博客时,我们就可以随时收到并查看。这里就涉及到两个对象,一个是消息发布者(Noticer),还有一个就是消息接收者(Observer)
事情上JE上的每个用户ID既是消息发布者也是消息接收者,怎么说呢?
1.当用户A被一群人订阅时,那么它就是消息发布者,当他有写了新博客时,它就会通知所有订阅他的人,告诉他们我写了新博客了。
2.同样,用户A他也可能订阅订阅别人的博客,这个时候他就是消息接收者了
下面就写个简单的代码示之:
首先定义消息发布者接口(Notice)跟消息接收者接口(Observer):
1.订阅者-观察者接口
Observer.java
package com.xuyi.observer;
/**
* @author xuyi
* 观察者-订阅者
*/
public interface Observer {
public void update(String message);
}
2.信息发布者接口
Noticer.java
package com.xuyi.observer;
/**
* @author xuyi
* 信息发布者
*/
public interface Noticer {
public void addObserver(Observer observer);
public void removeObserver(Observer observer);
public void notice(String message);
}
3.生成2个订阅-观察者
User1.java
package com.xuyi.observer;
public class User1 implements Observer {
public void update(String message) {
System.out.println(User1.class.getSimpleName()+":"+message);
}
}
User2.java
package com.xuyi.observer;
public class User2 implements Observer {
public void update(String message) {
System.out.println(User2.class.getSimpleName()+":"+message);
}
}
4.信息发布者实现:
NoticerImpl.java
package com.xuyi.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author xuyi
* 实现发布者
*/
public class NoticerImpl implements Noticer {
private List<Observer> observers = new ArrayList<Observer>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notice(String message) {
for(Observer ob : observers){
ob.update(message);
}
}
}
5.Test.java
package com.xuyi.observer;
//Observer模式-观察者模式
public class Test {
public static void main(String[] args) {
Noticer noticer = new NoticerImpl();
noticer.addObserver(new User1());
noticer.addObserver(new User2());
noticer.notice("新消息发布咯!");
}
}