观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
观察者模式通常由4部分组成,抽象的被观察者、具体的被观察者、抽象的观察者、具体的观察者。
代码示例
1、抽象的观察者
public interface Watcher { void update(); }
2、抽象的被观察者
public interface Subject { /** * 添加观察者 * @param watcher */ void addWatcher(Watcher watcher); /** * 删除观察者 * @param watcher */ void deleteWatcher(Watcher watcher); /** * 被观察者行为 */ void service(); }
这里方法service定义了被观察者的某种行为,当这种行为发生某种变化时将通知所有观察者。
3、具体的被观察者
public class ConcreteSubject implements Subject { private List<Watcher> watchers = new ArrayList<>(); private Integer value = 0; @Override public void addWatcher(Watcher watcher) { watchers.add(watcher); } @Override public void deleteWatcher(Watcher watcher) { watchers.remove(watcher); } @Override public void service() { System.out.println("被观察者做了一些事情,更新标识并通知所有观察者"); setValue(1); notifyAllWatcher(); } private void notifyAllWatcher() { if(getValue().equals(1)) { for(Watcher watcher : watchers) { watcher.update(); } } } public Integer getValue() { return value; } public void setValue(Integer value) { this.value = value; } }
4、具体的观察者
public class FirstWatched implements Watcher { @Override public void update() { System.out.println("first watched updated..."); } }
public class SecondWatched implements Watcher { @Override public void update() { System.out.println("second watched updated..."); } }
5、测试代码
public class Main { public static void main(String[] args) { Watcher firstWatched = new FirstWatched(); Watcher secondWatched = new SecondWatched(); Subject subject = new ConcreteSubject(); subject.addWatcher(firstWatched); subject.addWatcher(secondWatched); subject.service(); } }
6、输出
被观察者做了一些事情,更新标识并通知所有观察者
first watched updated...
second watched updated...