观察者模式(Observer Pattern)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式属于行为型模式。
- Subject:被观察的对象。
- Observer:即观察者,他会观察一个Subject。
然后讲个故事:小明订阅了哈哈日报,那么每次中国日报更新都会通知小明查看新闻。
Subject(哈哈日报):
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private String newsTitle;
public String getNewsTitle() {
return newsTitle;
}
public void setNewsTitle(String newsTitle) {
this.newsTitle = newsTitle;
notifyAllObservers();
}
public void attach(Observer observer) {
observers.add(observer);
}
public void unsubscribe(Observer observer) {
if (observers.contains(observer)) {
observers.remove(observer);
}
}
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
Observer:
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
小明:
public class XiaoMing extends Observer {
public XiaoMing(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("小明说:哇,快来看,哈哈日报有新的新闻!是:" + subject.getNewsTitle());
}
}
小明订阅了哈哈日报,所以哈哈日报每次更新新闻都会使依赖于它的对象都得到通知并被自动更新。
public static void main(String[] args) {
Subject subject = new Subject();
XiaoMing xiaoMing = new XiaoMing(subject);
//更新新闻1
subject.setNewsTitle("今天是70周年国庆!");
//更新新闻2
subject.setNewsTitle("91年小伙酒驾被查,自称只是孩子求原谅,93年交警:难道我是宝宝?");
}
此时可以有多个订阅者,订阅者在观察对象更新后都会得到通知。
运行结果:
小明说:哇,快来看,哈哈日报有新的新闻!是:今天是70周年国庆!
小明说:哇,快来看,哈哈日报有新的新闻!是:91年小伙酒驾被查,自称只是孩子求原谅,93年交警:难道我是宝宝?