初学Head first设计模式一点心得笔记
观察者模式主要解决的问题:一个对象改变了给其他对象对象的通知问题
对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
应用举例
类似于报纸订阅服务,订阅者们可以订阅一个报社的报纸,只要报社一更新最新的报纸新闻,立马会给每一个订阅者发送最新的报纸,订阅者也可以取消订阅,取消之后,就收不到以后报社的消息了。
案例抽象
对上面这个案例进行抽象,订阅者被叫做观察者,报社叫主题,发报纸这个过程叫做通知,所以就有了下面这个一对多的关系。
观察者模式类图
用观察者模式实现报纸订阅服务
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
public interface Observer {
public void update(String newspaper);
}
import java.util.ArrayList;
public class NewspaperOffice implements Subject {
private ArrayList<Observer> observers;
private String newspaper;
public void setNewspaper(String newspaper) {
this.newspaper = newspaper;
}
public NewspaperOffice(){
observers = new ArrayList<>();
}
public String getNewspaper() {
return newspaper;
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int i = observers.indexOf(observer);
if(i>=0){
observers.remove(i);
}
}
@Override
public void notifyObservers() {
for(Observer ob:observers){
ob.update(getNewspaper());
}
}
}
public class Subscriber implements Observer {
Subject newspaperOffice;
public Subscriber(Subject newspaperOffice) {
this.newspaperOffice=newspaperOffice;
this.newspaperOffice.registerObserver(this);
}
@Override
public void update(String newspaper) {
System.out.println("我收到最新的消息是:"+newspaper);
}
}
测试订阅服务代码
public class Main {
public static void main(String[] args){
NewspaperOffice ABC = new NewspaperOffice();
Observer me = new Subscriber(ABC);
ABC.setNewspaper("it's the news today");
ABC.notifyObservers();
ABC.setNewspaper("疫情快好吧");
ABC.notifyObservers();
}
}
有几点关键
- 在主题对象里面有一个ArrayList用来存放观察者们
- 每一个观察者在创建时候指定它的观察的主题,建立一条消息通知通道