观察者模式:定义了对象之间的一对多依赖关系,让一个或者多个观察者对象去观察一个被观察者对象;当被观察者对象的状态发生变化时,系统能自动通知所有观察者对象,从而观察者对象得到自动更新。在J2EE中的有广泛使用,主题订阅模式下的JMS本身就是观察者模式的应用。Java事件机制的实现就是观察者模式实现的。下面是观察者模式的实例:
1.
package com.lanp.observer;
/**
* 订阅者接口,对应观察设计模式中的观察者接口
* @author LanP
* @version v1.0
*/
public interface ISubscriber {
void update(AbstractPublisher abstractPublisher,Object obj);
}
2.
package com.lanp.observer;
import java.util.ArrayList;
import java.util.List;
/**
* 消息的发布者工具类,对应于观察者设计模式中的
* @author Administrator
*
*/
public abstract class AbstractPublisher {
/**
* 存放订阅者
* 用于存放监听消息发布者发布消息的集合
* 对应于观察者设计模式就是存放观察者
*/
List<ISubscriber> subscribers = new ArrayList<ISubscriber>();
/**
* 注册订阅者(观察者)
* @param subscriber
*/
public void registrSubscriber(ISubscriber subscriber) {
subscribers.add(subscriber);
}
/**
* 移除订阅者(观察者)
* @param subscriber
*/
public void removeSubscriber(ISubscriber subscriber) {
subscribers.remove(subscriber);
}
/**
* 发布者(被观察者)发布了消息后通知所有订阅者(观察者)
* @param obj
*/
public void noticeSubscriber(Object obj) {
if(null != subscribers) {
for(ISubscriber subscriber: subscribers) {
subscriber.update(this, obj);
}
}
}
}
3.
package com.lanp.observer;
import java.util.Date;
public class MyPublisher extends AbstractPublisher {
private String subject;
private Date pubTime;
public MyPublisher() {
}
public MyPublisher(String subject, Date pubTime) {
this.subject = subject;
this.pubTime = pubTime;
}
public String getSubject() {
return subject;
}
/**
* 当使用setSubject方法来修改主题时
* 程序自动触发发布者的所有订阅者监听事件
* @param subject
*/
public void setSubject(String subject) {
this.subject = subject;
noticeSubscriber(subject);
}
public Date getPubTime() {
return pubTime;
}
/**
* 当使用setSubject方法来修改发布时间时
* 程序自动触发发布者的所有订阅者监听事件
* @param pubTime
*/
public void setPubTime(Date pubTime) {
this.pubTime = pubTime;
noticeSubscriber(pubTime);
}
}
4.
package com.lanp.observer;
/**
* 主题观察者
* @author LanP
* @version v1.0
*/
public class MySubObserver implements ISubscriber {
@Override
public void update(AbstractPublisher abstractPublisher, Object obj) {
if(obj instanceof String) {
System.out.println("主题观察者: " + abstractPublisher
+ ";消息的主题改为: " + obj);
}
}
}
5.
package com.lanp.observer;
import java.util.Date;
/**
* 时间观察者
* @author LanP
* @version v1.0
*/
public class MyPubTimeObserver implements ISubscriber {
@Override
public void update(AbstractPublisher abstractPublisher, Object obj) {
if(obj instanceof Date) {
System.out.println("时间观察者: " + abstractPublisher
+ ";消息的时间改为: " + obj.toString());
}
}
}
6.
package com.lanp.observer;
import java.util.Date;
/**
* 订阅者观察消息发布
* @author LanP
* @version v1.0
*/
public class MyTestObserver {
public static void main(String[] args) {
//发布者发布消息——被观察者
MyPublisher myPublisher = new MyPublisher("飘红",new Date());
//订阅者1——主题观察者
ISubscriber mySubObserver = new MySubObserver();
//订阅者2——时间观察者
ISubscriber myPubTimeObserver = new MyPubTimeObserver();
//消息发布者注册订阅者——被观察者注册观察者
myPublisher.registrSubscriber(mySubObserver);
myPublisher.registrSubscriber(myPubTimeObserver);
//被观察者(消息发布者)中的主题和时间改变了自动通知观察者(订阅者)
myPublisher.setSubject("飘飘红红");
myPublisher.setPubTime(new Date());
}
}