观察者模式Observer
广播机制的场景:
场景:
聊天室程序的创建。服务器创建好后,A,B,C三个客户端连上来公开聊天。A向服务器发送数据,服务器端聊天数据改变。我们希望将这些聊天数据分别发给其他在线的客户。也就是说,每个客户端需要更新服务器端得数据。
网站上,很多人订阅了“Java主题”的新闻。当有这个主题新闻时,就会将这些新闻发给所有订阅的人。
大家一起玩CS游戏时,服务器需要将每个人的方位变化发给所有的客户
上面这些场景,我们都可以使用观察者模式来处理。我们可以把多个订阅者,,客户称之为观察者:需要同步给多个订阅者的数据封装在对象中,称之为目标。
核心:
观察者模式主要用于1:N的通知。当一个对象(目标对象Subject或者ObjServable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observer),令他们做出响应
通知观察者的方式:
推:
每次都会把通知以广播方式发送给所有观察者,所有观察者只能被动接受
拉:
观察者只要知道有情况变化即可至于什么时候获取内容获取什么内容,都可以自主决定。
Java.util.Observable和java.util.Observer来实现观察者模式
开发中常见场景:
聊天室程序的,服务器转发给所有的客户端
网络游戏(多人联机对战)场景中,服务器将客户端的状态进行分发
邮件订阅
Servelet中,监听器的实现
JDK中的AWT中事件处理模型,基于观察者模式的委派时间模型(Delegation)Event Model
事件源:======目标对象
事件监听器============观察者
======================================
package com.bjsxt.cn.observer2;
import java.util.Observable;
public class ConcreteSubject extends Observable{
private int state;
public void setState(int state) {
this.state = state;
setChanged();
notifyObservers(state);
}
public int getState() {
return state;
}
public ConcreteSubject(int state) {
super();
this.state = state;
setChanged();
notifyObservers(state);
}
@Override
public void notifyObservers() {
super.notifyObservers();
}
}
======================================
package com.bjsxt.cn.observer2;
import java.util.Observable;
import java.util.Observer;
public class ObserverA implements Observer {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
@Override
public void update(Observable arg0, Object arg1) {
setState(((ConcreteSubject)arg0).getState());
}
}
====================================
GOF23设计模式之观察者模式的理解与实现2(使用java自带的观察者类和接口)
原文地址:http://blog.csdn.net/lk142500/article/details/45102925