定义
观察者模式(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 ListmObservers; 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()>>>>>>>2ObserverA:在吗????ObserverB : 在吗????>>>>>>>>>>>>>>>>> >>>>>mObservers.size()>>>>>>>1ObserverB : 在吗????复制代码