概述
日常生活中,我们在某个应用中订阅某一主题的信息,那么该应用会向我们推送我们所订阅类型的相关信息;或者说我们定了X类型的报纸,那么送报员每天会给我们送来X类型的报纸,让我们能够得知该类型的最新动态。以上的两种场景,就是观察者模式的表现。我们就像是观察者,而我们订阅的主题就像是被观察者,只要他们有最新的消息(更新)就会来通知我们,使我们可得知最新的动态,方便我们作出一系列的操作等。
观察者模式
直接上代码
//观察者抽象类
public interface Observer {
void update(String str);
}
//具体的观察者
public class ContentObserver implements Observer {
@Override
public void update(String str) {
System.out.println("receive--"+str);
}
}
//主题最上层
public interface Stub {
//注册观察者
void regist(Observer observer);
//解除观察者
void unregist(Observer observer);
//通知
void notifyUpdate(String str);
}
//具体的主题
import java.util.*;
public class ContentStub implements Stub {
private List<Observer>list=new ArrayList<Observer>();
@Override
public void regist(Observer observer) {
if(list!=null)
list.add(observer);
}
@Override
public void unregist(Observer observer) {
list.remove(observer);
}
@Override
public void notifyUpdate(String str) {
for (Observer observer : list) {
observer.update(str);
}
}
}
//客户端
Stub s=new ContentStub();
Observer o=new ContentObserver();
s.regist(o);
s.notifyUpdate("have a new data");
s.unregist(o);
输出结果:receive--have a new data
优点:高度解耦,将主题与观察者分开,观察者不在乎主题里面的内部实现。
缺点:执行效率低,在多观察者时,如果其中一个在接收过程中出现问题(比如停顿),那么会影响到在它后面的观察者。