Java中的观察者模式

注:基于《Java高并发编程详解-汪文君》、《深入理解JVM高级特性与最佳实践-周志明》,以学习为目的,加上自身理解、验证。作为笔记,为加深印象,做到不复制,不粘贴。欢迎,大家一起交流学习。

观察者模式

又叫做发布-订阅模式。观察者模式定义了一种一对多的依赖关系。使得多个观察对象可以去监听到同一个主题对象,当其状态发生改变时,会通知到所有的观察者。

观察者模式的结构

1.抽象主题角色

抽象主题角色把所有的观察者的引用保存在一起,每一个主题角色都可以有任意多个观察者。抽象主题角色踢狗一个操作的接口,可以增加或者删除观察者对象。

2.具体主题角色

在观察者对象中保存与其相关的状态,当具体的主题对象内部状态发生改变时,通知到所有注册的观察者对象,进行其自身内部状态的改变。

3.抽象观察者角色

提供一个操作接口,在具体主题角色状态发生改变时,更新具体观察者的状态。

4.具体观察者角色

保存和主题的状态相关的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态协调。

观察者模式示例

public interface Observer {

    void process(String event);

}
public class ObserverImpl implements Observer {

    public void process(String event) {
        System.out.println("观察者看到:" +event);
    }
}
public abstract class Subject {

    private List<Observer> list = new ArrayList<Observer>();

    // 加入观察者对象
    public void add(Observer observer) {
        list.add(observer);
    }

    // 移除观察者对象
    public void remove(Observer observer) {
        list.remove(observer);
    }

    // 当有事件发生时,通知所有观察者对象
    public void notifyObservers(String event) {
        for (int i = 0; i < list.size(); i++) {
            list.get(i).process(event);
        }
    }

}
public class SubjectImpl extends Subject {

    private String event;

    public String getEvent() {
        return event;
    }

    public void onEvent(String event)
    {
        this.event = event;
        System.out.println("发生事件:" + event);
        // 通知所有观察者
        this.notifyObservers(event);
    }

}
public class Main {

    public static void main(String[] args) {

        SubjectImpl subject = new SubjectImpl();
        Observer observer = new ObserverImpl();
        subject.add(observer);
        subject.onEvent("event say hello");
    }
}

运行结果:

发生事件:event say hello
观察者看到:event say hello

观察者模式在Java中的应用java.util.Observer接口

 1 /**
 2  * A class can implement the <code>Observer</code> interface when it
 3  * wants to be informed of changes in observable objects.
 4  *
 5  * @author  Chris Warth
 6  * @see     java.util.Observable
 7  * @since   JDK1.0
 8  */
 9 public interface Observer {
10     /**
11      * This method is called whenever the observed object is changed. An
12      * application calls an <tt>Observable</tt> object's
13      * <code>notifyObservers</code> method to have all the object's
14      * observers notified of the change.
15      *
16      * @param   o     the observable object.
17      * @param   arg   an argument passed to the <code>notifyObservers</code>
18      *                 method.
19      */
20     void update(Observable o, Object arg);
21 }

...未完

public class ObserverImpl implements Observer {

public void process(String event) {
System.out.println("观察者看到:" +event);
}
}
原文地址:https://www.cnblogs.com/sunl123/p/11123942.html