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