注:基于《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