观察者模式是一种用途很大的设计模式,可以将主动查询转为被动等待,即“你不要call我,有事我会call你”,这样可以大大减少交互的次数。观察者模式中有两个角色,观察者(Observer)和被观察者(Subject,也称为主题),观察者可以决定要不要订阅主题,如果订阅了,主题会在自身发生变化的时候通知这些关心的观察者;如果你不关心这个主题了,也可以把自己从列表移除,观察者模式的主要代码如下,对于主题的实现(已省略Subject的interface):
public class ConcreteSubject implement Subject{
List<Observer> observerList = new ArrayList<>();
public void registerObserver(Observer observer){
if(!observerList.contains(observer)){
observerList.add(observer);
}
}
public void removeObserver(Observer observer){
int i = observerList.indexof(observer);
if(i >= 0){
observerList.remove(observer);
}
}
}
public void onDataChange(){
observerList.foreach(Observer::update())
}
}
对于观察者Observer的实现(已省略interface),其结构如下:
public class ConcreteObserver implement Observer{
Subject subject;
public Observer(Subject subject1){
this.subject = subject1;
subject.registerObserver(this);
}
public void update(){
//do something
}
}
在现实生活中,观察者模式更加灵活,在spring中有@Autowire方法,可以自动注入所有实现了Observer接口的类,这样就能省略registerObserver方法。update方法也可以增加入参,来携带需要传递的信息,比如根据入参type来决定是add、update还是reload。