观察者模式
定义一种一对多的依赖关系,让多个观察对象同时监听某一主题对象。这个主题对象在状态发生变化时会通知所有的观察者对象,使他们自动更新状态
Subject
package com.hml.observer; import java.util.ArrayList; import java.util.List; public class Subject { List<Observer> observers = new ArrayList<Observer>(); public void addObserver(Observer o) { observers.add(o); } public void deleteObserver(Observer o) { observers.remove(o); } public void notifyChange() { for (Observer o : observers) { o.update(); } } }
Observer
package com.hml.observer; public interface Observer { public void update(); }
ConcreateObserverA
package com.hml.observer; public class ConcreateObserverA implements Observer { public void update() { System.out.println("A update"); } }
ConcreateObserverB
package com.hml.observer; public class ConcreateObserverB implements Observer { public void update() { System.out.println("B update"); } }
Test
package com.hml.observer; public class Test { public static void main(String[] args) { Subject subject = new Subject(); subject.addObserver(new ConcreateObserverA()); subject.addObserver(new ConcreateObserverB()); subject.notifyChange(); } }
类图
将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各个类紧密耦合,这样会给维护、扩展和重用带来不便。而观察者模式的关键是主题Subject和观察者Observer,一个Subject可以有人以数量的依赖它的Observer,一旦Subject的状态发生了变化,所有的Observer都可以得到通知。Subject发出通知并不需要知道谁是他的观察者,也就是说,具体观察者是谁,他根本不需要知道。而任何一个具体的观察者都不知道也不需要知道其他观察者的存在。因此当一个对象的改变需要同时改变其他的对象时,就可以使用观察者模式。