观察者模式(Observer)----行为笔记
Observer模式:定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
拓展:事件委托
一、涉及角色:
1、 抽象主题(Subject):把所有观察者对象保存在一个集合里,称为被观察者
(ObServable)一般用抽象类实现,
2、 具体主题(ConcreteSubject):保存有关状态;在具体主题内部状态改变时,通知观察者。
3、 抽象观察者(Observer)一般为接口;为所有具体观察者定义接口,
4、 具体观察者(ConcreteObserver):可以保存指向具体主题对象的引用。
二、 何时使用观察者模式
1、当一个对象的改变需要同时改变其他对象,且它不知道具体有多少对象有待改变,
2、一个抽象模型有两个方面,其中一方面依赖于另一方面,用观察者,可将这两方面封装在独立的对象中,使它们各自独立地改变和复用,
三、故事说明
OBSERVER—想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦
观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
抽象被观察者
//抽象主题(被观察者) public abstract class Observable { Vector<Observer> observerList = new Vector<Observer>(); //建了一个QQ群; public void addObserver(Observer o){ observerList.add(o); } public void deleteObserver(Observer o){ observerList.remove(o); } public void notifyObservers(){ for(Observer observer : observerList){ observer.update(this, null); } } }
具休主题(被观察者A)
//具休主题(被观察者A) public class ConcreteObserableB extends Observable { //小李他的 群定义为 //学习群,专门出集学习资料信息,并在群里共享, String message; public void foundInfo(String message) { //资料信息,并通知给群友 this.message = message; notifyObservers(); } @Override public void notifyObservers() { for(Observer observer : observerList){ observer.update(this, message); } } }
抽象观察者(Observer)//抽象观察者(Observer) public interface Observer { public void update(Observable o, Object arg); }
抽象观察者A(Observer)
//抽象观察者A(Observer) public class ConcreteObserverA implements Observer{ @Override public void update(Observable o, Object arg) { //更新 来自群主的信息 System.out.println("来自群主A:--->" + arg ); } }
抽象观察者B(ObserverB)public class ConcreteObserverB implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("来自群主B:--->" + arg ); } }
客户端调用public static void main(String[] args) { Observer observerA = new ConcreteObserverA(); //观察者A Observer observerB = new ConcreteObserverB(); //观察者B ConcreteObserableA observableA = new ConcreteObserableA(); //被观察者A 小张 ConcreteObserableB observableB = new ConcreteObserableB(); //被观察者B 小李 observableA.addObserver(observerA); //观察者A加 小张群,获取(观察)群信息 observableB.addObserver(observerB); observableA.foundGire("发现一个女生,在XX角落"); observableB.foundInfo("java编程思想"); }
打印信息:来自群主A:--->发现一个女生,在XX角落
来自群主B:--->java编程思想