概述
观察者模式可以简单地理解为发布订阅模式,比如公众号,大白话就是用户是观察者,而公众号是被观察者,当公众号有新更新的时候用户就会察觉并获得信息,实现了一对多的消息发布;本质上描述的是对象之间的一对多的依赖关系,当一个对象状态改变,依赖它的对象将会收到通知
包含的角色
- 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
- 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
- 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
- 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。
举个栗子
public interface Observerable{
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObserver();
}
public interface Observer{
void update(String message);
}
public class Server implements Observerable{
private List<Observer> observerList;
private String message;
public Server(){
this.observerList = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o){
this.observerList.add(o);
}
@Override
public void removeObserver(Observer o){
this.observerList.remove(o);
}
@Override
public void notifyObserver(){
for (Observer o: observerList)
o.update(message);
}
}
public class User implements Observer{
@Override
public void update(String message){
System.out.println(message);
}
}
观察者模式与发布订阅模式的区别
前面概述说了可以简单理解为发布订阅模式,但其实此二者是有区别的,发布订阅模式是一种消息传递的模式,事实上,
- 观察者模式中观察者与被观察者属于耦合关系(被观察者持有观察者的引用),多用于实时事务处理系统;
- 发布订阅模式中发布者与订阅者是通过一种类似消息通道的机制传递信息的,即发布者与订阅者互不知道对方的存在,而是借用了中间的通道作为信息载体(也可以称为调度中心),极大降低了耦合性
网友评论