举一个最经典的例子:观察者模式 其实就相当于 出版者+订阅者 的关系
当有新闻时,订阅者就会得到来自出版者那边的报纸;当然,若不想订阅报纸,取消订阅即可,之后出版者也就不会再发报纸给你;反之,若想订阅报纸,注册为订阅者即可。
观察者模式的定义:观察者模式定义了对象之间的一对多依赖关系【主题(出版者)与观察者(订阅者)】。主题是真正拥有数据的人,观察者是主题的依赖者。
理解:: 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
转自:https://segmentfault.com/a/1190000015781946
public interface Updatable {
void update(Magazine magazine)
}
List readers = new ArrayList(); // 订购杂志的人员列表
public void inform() {
for (Updatable reader : readers) {
reader.update(this);
}
}
转自:四、观察者模式_勇敢牛牛-CSDN博客
// Observer抽象类,扩展了实体Observer的实体类
public abstract class Observer {
// 把一个类放进抽象类中意义:其实与普通类中放进去道理一样
public Subject subject;
// 定义抽象类,由实现类实现
public abstract void update();
}
主题(出版社),里面有要通知的观察者们,定义为一个
public class Subject {
private List observers = new ArrayList();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
// 通知所有的观察者,调用notifyall()方法
notifyAllObservers();
}
public void add(Observer observer) {
observers.add(observer);
}
public void notifyAllObservers() {
for (Observer observer : observers) {
// 更新每一个观察者查看的信息
observer.update();
}
}
}
观察者1号:
public class OctalObserver extends Observer {
public OctalObserver(Subject subject) {
this.subject = subject;
this.subject.add(this);
}
@Override
public void update() {
System.out.println("Octal String: "
+ Integer.toOctalString(subject.getState()));
} // Integer.toOctalString()十进制转成八进制
}
观察者2号:
public class HexaObserver extends Observer {
public HexaObserver(Subject subject) {
this.subject = subject;
this.subject.add(this);
}
@Override
public void update() {
System.out.println("Hex String: "
+ Integer.toHexString(subject.getState()).toUpperCase());
}
}
//Integer.toHexString方法返回的字符串表示的无符号整数参数所表示的值以十六进制.
发布者:(观察者模式功能测试)
神奇的地方在于我只是subject.setState(10);把subject它的值改变了,那么来个观察者就会跟着引起改变。
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
//First state change: 15
//Hex String: F
//Octal String: 17
System.out.println("Second state change: 10");
subject.setState(10);
//Second state change: 10
//Hex String: A
//Octal String: 12
}
}
那 subject.setState(10);是怎么让observer跟着把输出发生了变化呢???
是因为在Subject类中,我们每一次setState的时候都通知了所有的观察者。这时候观察者就能进行update更新语句了。
public void setState(int state) {
this.state = state;
// 通知所有的观察者,调用notifyall()方法
notifyAllObservers();
}
public void notifyAllObservers() {
for (Observer observer : observers) {
// 更新每一个观察者查看的信息
observer.update();
}
}
问题出在了这里,我们获取this.subject,再打印this.subject.getState(),这个this.subject是什么时候变了的?当你set一个新的值得时候就变了。(真绕啊)
public OctalObserver(Subject subject) {
this.subject = subject;
this.subject.add(this);
}


