1. 概念
定义对象间的一对多依赖关系,当一个对象状态发生改变时,所有依赖它的对象都得到通知并且自动更新。
结构:
Observer【观察者接口】:接口,规定了具体观察者用来更细致操作的方法
subject【主题】:接口,增加,删除,通知更新观察者
【具体主题】:实现主题接口的实例,包含可以经常变化的数据,需要还是用一个集合
【具体观察者】实现观察者接口的实例
2. 实例
首先我们定义观察者接口
public interface Observer {
public void startTask(String msg);
}
然后定义主题接口,包含新增删除和通知
public interface Subject {
public void addObserver(Observer o);
public void delObserver(Observer o);
public void notifyObserver();
}
然后是主题的具体实现
我们采取一个ArrayList来存放具体的观察者对象
ublic class SeekJobCenter implements Subject {
String msg;
boolean changed;
//存放观察者
ArrayList<Observer> userList;
public SeekJobCenter() {
userList = new ArrayList<Observer>();
msg = "";
changed = false;
}
@Override
public void addObserver(Observer o) {
if (!userList.contains(o)) {
userList.add(o);
}
}
@Override
public void delObserver(Observer o) {
if (userList.contains(o)) {
userList.remove(o);
}
}
@Override
public void notifyObserver() {
if (changed) {
userList.forEach(o -> o.startTask(msg));
}
changed = false;
}
public void giveNewMsg(String str) {
if (str.equals(msg)) {
changed = false;
} else {
msg = str;
changed = true;
}
}
}
具体的观察者对象A
public class NodeA implements Observer {
Subject subject;
public NodeA(Subject subject) {
this.subject = subject;
subject.addObserver(this);
}
@Override
public void startTask(String msg) {
System.out.println("this is NodeA. msg is " + msg);
}
}
具体的观察者对象B
public class NodeB implements Observer {
Subject subject;
public NodeB(Subject subject) {
this.subject = subject;
subject.addObserver(this);
}
@Override
public void startTask(String msg) {
System.out.println("this is NodeB. msg is " + msg);
}
}
测试类
public class Test {
public static void main(String[] args) {
SeekJobCenter seekJobCenter = new SeekJobCenter();
NodeA a = new NodeA(seekJobCenter);
NodeB b = new NodeB(seekJobCenter);
seekJobCenter.giveNewMsg("hello");
seekJobCenter.notifyObserver();
}
}