1.什么是观察者设计模式:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
2.什么时候使用观察者设计模式:
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
3.观察者设计模式的优缺点:
优点:1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点:1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
4.观察者设计模式的实现:
我们以订阅报纸为例:刚开始老王和老冯都订阅了报纸,然后第一天都收到了报纸,第二天老王感觉报纸没意思就退订了。第二天只有老冯收到了报纸信息
import java.util.ArrayList;
import java.util.List;
public class NewspaperSubject {
private List<Observer> observerList = new ArrayList<>();
private String news;
public String getNews() {
return news;
}
public void setNews(String news) {
this.news = news;
notifiAllObservers(news);
}
private void notifiAllObservers(String news) {
for (int i = 0; i < observerList.size(); i++) {
observerList.get(i).update(news);
}
}
public void attach(Observer observer){
observerList.add(observer);
}
public void deattach(Observer observer){
observerList.remove(observer);
}
}
public abstract class Observer {
protected NewspaperSubject subject;
public abstract void update(String state);
}
public class WangObserver extends Observer {
public WangObserver(NewspaperSubject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update(String state) {
System.out.println("老王收到的报纸信息:"+state);
}
}
public class FengObserver extends Observer {
public FengObserver(NewspaperSubject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update(String state) {
System.out.println("老冯收到的报纸信息:"+state);
}
}