1.观察者模式定义了一系列对象之间的一对多关系,当一个对象的状态改变,其他依赖者都会收到通知。
2.观察者模式包含四个角色
(1)抽象被观察者
(2)抽象观察者
(3)具体被观察者
(4)具体观察者
3.具体的被观察者和观察者之间是松耦合的,被观察者唯一依赖的就是实现了观察者接口的一个对象列表。被观察者不需要知道观察者的具体实现类是谁、做了些什么。我们可以随时新增,修改观察者,而不用修改被观察者代码。所要做的就是在新的类里实现抽象的观察者接口,然后注册为观察者即可。被观察者不在乎别的,它只会发通知给所有实现了观察者接口的对象。
4.观察者模式具体实现
(1)定义一个抽象被观察者接口
public interface Observerable {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
(2)定义一个抽象观察者接口
/**
*定义一个update()方法,当被观察者调用notifyObserver()方法时,观察者的update()方法会被调用。
*/
public interface Observer {
public void update(String message)
}
(3) 定义被观察者,实现了Observerable接口,对该接口的三个方法进行具体的实现,并维护一个List,用来保存注册的观察者,需要时来遍历并通知所有观察者。
public class MyObserverable implements Observerable {
private List<Observer> list;
private String message;
public MyObserverable() {
list = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
list.add(o);
}
@Override
public void removeObserver(Observer o) {
if(!list.isEmpty()) {
list.remove(o);
}
}
@Override
publice void notifyObserver() {
for(int i = 0; i < list.size(); i++) {
Observer observer = list.get(i);
observer.update(message);
}
}
public void publicMessage(String s) {
message = s;
notifyObserver();
}
}
(4) 定义具体的观察者, 实现了update()方法
public class MyObserver implements Observer {
@Override
public void update(String message) {
System.out.println("已收到消息 :" + message);
}
}