观察者模式通常用作一对多的通知,即多个观察者监听一个消息事件。
通常,我们可以在消息事件的主体中维护一个观察者列表。
在事件发生时,遍历自身维护的列表,将消息发布出去。
public interface Subject {
//注册新的观察者
public boolean registerObserver(StudentObserver so);
//移除现有的某个观察者
public boolean removeObserver(StudentObserver so);
//发布消息事件
public void notifyObservers(String message);
}
public class YuWenSubject implements Subject {
//维护一个观察者列表
private List<StudentObserver> observers = Collections.synchronizedList(new ArrayList<StudentObserver>());
//新增观察者
@Override
public boolean registerObserver(StudentObserver so) {
if (observers.contains(so)) {
return true;
}
return observers.add(so);
}
//移除观察者
@Override
public boolean removeObserver(StudentObserver so) {
return observers.remove(so);
}
//发布消息
@Override
public void notifyObservers(String message) {
//遍历循环,推送消息给观察者
for (StudentObserver s : observers) {
s.update(message);
}
}
}
public interface Observer {
// 观察者接收消息
public void update(String message);
}
public class StudentObserver implements Observer {
private String name;
private String message;
public StudentObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
System.out.println(this.name + ":" + message);
}
}
@Test
public void notifyObservers() {
YuWenSubject ys = new YuWenSubject();
StudentObserver zhangsan = new StudentObserver("张三");
StudentObserver lisi = new StudentObserver("李四");
StudentObserver wangwu = new StudentObserver("王五");
StudentObserver zhaoliu = new StudentObserver("赵六");
ys.registerObserver(zhangsan);
ys.registerObserver(lisi);
ys.registerObserver(wangwu);
ys.registerObserver(zhaoliu);
ys.notifyObservers("today is 2019.12.20");
ys.removeObserver(wangwu);
ys.notifyObservers("today is 2019.12.21");
}
jdk的源代码中也实现了观察者模式:
消息主体
观察者