Java设计模式 - 观察者模式

一, 观察者模式类图结构

Java设计模式 - 观察者模式_第1张图片

① 抽象主题(ISubject)

每个对象都可以有任何数量的观察者,并且提供增加、删除观察者的接口。

 主题对象(Subject)

抽象主题的实现类,该主题对象的所有观察者(监听者)封装在一个集合中,当改主题状态发生变化时,会通知所有观察者(集合中),进行及时的更新。

 抽象观察者

定义一个接口,在“观察”到主题变化后,更新自己。

 观察者对象

观察”到主题变化后,更新自己的具体实现。


二,代码

① ISubject.java
public interface ISubject {
 /**
  * 增加观察者
  * @param obs
  */
 public void addObserver(IObserverobs);
 
 /**
  * 删除观察者
  * @param obs
  */
 public void removeObserver(IObserverobs);
 
 /**
  * 主题发生改变,通知所有观察者
  */
 void notifyUpdate();
}

② Subject.java

import java.util.Enumeration;
import java.util.Vector;
public class Subject implements ISubject {
   
    // 该主题的观察者集合
    private Vector<IObserver> observers = new Vector<IObserver>();
   
    @Override
    public void addObserver(IObserver obs) {
        observers.add(obs);
    }
    
    @Override
    public void removeObserver(IObserver obs) {
        observers.remove(obs);
    }
    
    @Override
    public void notifyUpdate() {
        Enumeration<IObserver> enums = ((Vector<IObserver>) observers.clone()).elements();
        while (enums.hasMoreElements()) {
            enums.nextElement().update();
        }
    }
}

③ IObserver.java

public interface IObserver {
    /**
     * 观察者更新自己
     */
    void update();
}

④ Observer.java

public class Observer implements IObserver {
    @Override
    public void update() {
        System.out.println("I am nofitied!");
    }
}

⑤ 测试Main函数

public class TestMain {
    /**
     * @param args
     */
    public static void main(String[] args) {
        ISubject sub = new Subject();
        sub.addObserver(new Observer());
        sub.addObserver(new Observer());
        sub.notifyUpdate();
    }
}

说明

★ 观察者集合,增加、删除观察者的动作也可以封装在接口中。

三, Java对观察者模式的支持

1、在java.util库里,提供了下面两个类,以支持观察者模式。

  • java.util.Observable;

  • java.util.Observer;

2、示例代码

① 主题对象: TestSubject.java

import java.util.Observable;
public class TestSubject extends Observable {
    private String data = "";
    /**
     * 主题状态改变
     */
    public void changeDate(String data) {
        this.data = data;
        setChanged(); // 标示主题状态发生了改变
        notifyObservers(); // 通知观察者
    }
    
    public String getData() {
        return this.data;
    }
}

② 观察者对象: TestObserver.java

public class TestObserver implements Observer {
    private String name;
    public TestObserver(String name) {
        super();
        this.name = name;
    }
    @Override
    public void update(Observable obs, Object arg) {
        if (obs instanceof TestSubject) {
            System.out.println(this.name + " # Data has been changed to: "
            + ((TestSubject) obs).getData());
        }
        // 同事监听了其他主题
        // if(obs instanceof XxxxxSubject){ }
    }
}

③ 测试代码

public class TestMain {
public static void main(String[] args) {
    // 创建主题
    TestSubject subject = new TestSubject();
    // 添加观察者
    subject.addObserver(new TestObserver("CC"));
    subject.addObserver(new TestObserver("TV"));
    // 状态改变
    subject.changeDate("get ");
    subject.changeDate("radio ");
    }
}

3、输出

TV # Data has been changed to: get 
CC # Data has been changed to: get 
TV # Data has been changed to: radio 
CC # Data has been changed to: radio

说明

如果兴趣,可以阅读下面两个类的源码:

java.util.Observable;

java.util.Observer;


你可能感兴趣的:(Java设计模式 - 观察者模式)