定义
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式是一种对象行为型模式。
模式结构
- Subject:目标 抽象的目标主要抽象的是观察这个的注册和注销,然后一个通知更新的方法
public interface Subject {
/**
* 注册观察者
* @param observer
*/
void registerObserver(Observer observer);
/**
* 取消观察者
* @param observer
*/
void removeObserver(Observer observer);
/**
* 通知更新
*/
void notifyObservers();
}
- ConcreteSubject: 具体目标
public class NotifyObserver implements Subject{
private List<Observer> mObservers;
public NotifyObserver() {
mObservers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
mObservers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int i = mObservers.indexOf(observer);
if (i >= 0) {
mObservers.remove(observer);
}
}
@Override
public void notifyObservers() {
System.out.print(" >>>>>mObservers.size()>>>>>>>" + mObservers.size());
System.out.println();
for (Observer o: mObservers) {
o.update("在吗????");
}
}
}
- Observer: 观察者 抽象的观察者,所有观察者共同拥有的一个接口。
public interface Observer {
/**
* 处理逻辑
* @param s
*/
void update(String s);
}
- ConcreteObserver: 具体观察者 观察者A
public class ObserverA implements Observer{
Subject mSubject;
public ObserverA(Subject subject) {
mSubject = subject;
mSubject.registerObserver(this);
}
@Override
public void update(String s) {
System.out.println("ObserverA:" + s);
}
}
观察者B
public class ObserverB implements Observer{
Subject mSubject;
public ObserverB(Subject subject) {
mSubject = subject;
mSubject.registerObserver(this);
}
@Override
public void update(String s) {
System.out.println("ObserverB : " + s);
}
}
测试代码
public class Test {
public static void main(String[] args) {
Subject subject = new NotifyObserver();
Observer observerA = new ObserverA(subject);
Observer observerB = new ObserverB(subject);
// 通知更新
subject.notifyObservers();
//移除监听
subject.removeObserver(observerA);
System.out.println(">>>>>>>>>>>>>>>>>");
subject.notifyObservers();
}
}
测试结果
>>>>>mObservers.size()>>>>>>>2
ObserverA:在吗????
ObserverB : 在吗????
>>>>>>>>>>>>>>>>>
>>>>>mObservers.size()>>>>>>>1
ObserverB : 在吗????