观察者模式

来源:互联网 发布:js拖动滑块验证 编辑:程序博客网 时间:2024/05/23 15:19

        观察者模式:定义了对象之间的一对多依赖关系,让一个或者多个观察者对象去观察一个被观察者对象;当被观察者对象的状态发生变化时,系统能自动通知所有观察者对象,从而观察者对象得到自动更新。在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());
 }

}

 

 

原创粉丝点击