定义
对象之间存在一对多关系,让多个观察者对象同时监听某一个对象,当这个对象发生变化时,他的所有观察对象都收到通知并更新,这种模式属于行为型模式。
应用场景
当更改一个对象的状态可能需要更改其他对象,而且要考虑到易用和低耦合,保证高度的协作。
优点
- 符合开闭原则
- 观察者和被观察者是抽象耦合的
缺点
- 被观察者不知道观察者是否接收到消息
- 若观察者也是其他观察者的被观察者,那么易造成死循环或者通知耗时
代码实现
被观察者
package com.elaine.testpattern.observer;
import java.util.ArrayList;
import java.util.List;
/**
* 被观察者
* <p>
* author: elaine
* date: 2021/4/21
*/
public class Subject {
private final List<Observer> observerList = new ArrayList<>();
private int data;
public int getData() {
return data;
}
/**
* 设置数据,且通知观察者更新数据
*
* @param data 数据
*/
public void setData(int data) {
this.data = data;
notifyObservers();
}
/**
* 添加观察者到列表
*
* @param observer 观察者
*/
public void attach(Observer observer) {
observerList.add(observer);
}
/**
* 循环通知观察者更新数据
*/
public void notifyObservers() {
for (Observer observer : observerList) {
observer.updateData();
}
}
}
观察者抽象方法
package com.elaine.testpattern.observer;
/**
* 观察者抽象方法
*
* author: elaine
* date: 2021/4/21
*/
public abstract class Observer {
protected Subject subject;
public abstract void updateData();
}
A 观察者
package com.elaine.testpattern.observer;
import android.util.Log;
/**
* A观察者
* author: elaine
* date: 2021/4/21
*/
public class AObserver extends Observer {
public AObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void updateData() {
Log.e("data===更新了数据", "A data==" + subject.getData());
}
}
B 观察者
package com.elaine.testpattern.observer;
import android.util.Log;
/**
* B观察者
* author: elaine
* date: 2021/4/21
*/
public class BObserver extends Observer {
public BObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void updateData() {
Log.e("data===新了数据", "B data==" + subject.getData());
}
}
运行代码
private void use() {
Subject subject = new Subject();
new AObserver(subject);
new BObserver(subject);
Log.e("data===", "old data is 15");
subject.setData(15);
Log.e("data===", "new data is 35");
subject.setData(35);
}
运行结果
被观察者发生变化后,A和B观察者也随着发生变化。