龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java中的观察者模式实例讲解

时间:2014-12-02 11:03来源:网络整理 作者:网络 点击:
分享到:
这篇文章主要介绍了Java中的观察者模式实例讲解,本文先是讲解了观察者模式的概念,然后以实例讲解观察者模式的实现,以及给出了UML图,需要的朋友可以参考下

观察者模式是一种行为设计模式。观察者模式的用途是,当你对一个对象的状态感兴趣,希望在它每次发生变化时获得通知。在观察者模式中,观察另外一个对象状态的对象叫做Observer观察者,被观察的对象叫着Subject被观察者。根据GoF规则,观察者模式的意图是:

复制代码 代码如下:

定义对象之间一对多的依赖关系,一个对象状态改变,其他相关联的对象就会得到通知并被自动更新。

Subject(被观察者)包含了一些需要在其状态改变时通知的观察者。因此,他应该提供给观察者可以register(注册)自己和unregister(注销)自己的方法。当Subject(被观察者)发生变化的时候,也需要包含一个方法来通知所有观察者。当通知观察者的时候,可以推送更新内容,或者提供另外一个方法来获得更新内容。

观察者应该有一种方法,这种方法能够设置观察者对象并且可以由被观察者使用来通知其更新。

JAVA提供了内置的方式来实现观察者模式,java.util.Observable和java.util.Observer接口。然而他们用的不是很广泛。因为此实现过于简单,大多数时候我们都不想最后扩展的类仅仅是实现了观察者模式,因为JAVA类不能多继承。

Java Messages Service(JMS)消息服务使用观察者模式与命令模式来实现不同的程序之间的数据的发布和订阅。

MVC模型-视图-控制框架也使用观察者模式,把模型当做被观察者,视图视为观察者。视图能够注册自己到模型上来获得模型的改变。

观察者模式例子

在此例中,我们将完成一个简单的主题讨论,观察者能够注册此主题。任何在此主题上的内容提交导致的变化都会通知所有在注册的观察者。

基于Subject被观察者的需求,这个是实现一个基本的Subject接口,此接口定了一系列具体的方法需要在随后实现接口的具体类中被实现。

复制代码 代码如下:

package com.journaldev.design.observer;

public interface Subject {

 //methods to register and unregister observers
 public void register(Observer obj);
 public void unregister(Observer obj);

 //method to notify observers of change
 public void notifyObservers();

 //method to get updates from subject
 public Object getUpdate(Observer obj);

}

现在创建一个相关联的观察者。它需要有一个方法能使Subject附属于一个观察者。另外的方法能够接受Subject的变化通知。

复制代码 代码如下:

package com.journaldev.design.observer;

public interface Observer {

 //method to update the observer, used by subject
 public void update();

 //attach with subject to observe
 public void setSubject(Subject sub);
}

这种关联已经建立。现在实现具体的主题。

复制代码 代码如下:

package com.journaldev.design.observer;

import java.util.ArrayList;
import java.util.List;

public class MyTopic implements Subject {

 private List<Observer> observers;
 private String message;
 private boolean changed;
 private final Object MUTEX= new Object();

 public MyTopic(){
  this.observers=new ArrayList<>();
 }
 @Override
 public void register(Observer obj) {
  if(obj == null) throw new NullPointerException("Null Observer");
  if(!observers.contains(obj)) observers.add(obj);
 }

 @Override
 public void unregister(Observer obj) {
  observers.remove(obj);
 }

 @Override
 public void notifyObservers() {
  List<Observer> observersLocal = null;
  //synchronization is used to make sure any observer registered after message is received is not notified
  synchronized (MUTEX) {
   if (!changed)
    return;
   observersLocal = new ArrayList<>(this.observers);
   this.changed=false;
  }
  for (Observer obj : observersLocal) {
   obj.update();
  }

 }

 @Override
 public Object getUpdate(Observer obj) {
  return this.message;
 }

精彩图集

赞助商链接