一.小结
- 定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
- 优点:1.观察者和被观察者是抽象耦合的 2.建立一套触发机制
- 缺点:1.观察者过多的情景下会降低效率 2.观察者不知道所观察的目标具体的变化,只是知道观察目标发生了变化。
- 常见的例子:许多基于观察者模式的事件库,如EventBus、Otto等;接口回调等
- 通用UML类图
二.例子
下面以文件系统监听文件变化为例:
-
被观察者
public class FileSystem { // 观察者集合 private List<IFileObserver> observers = new ArrayList<>(); public FileSystem() { } public void insertFile() { System.out.println("增加一个文件"); for (IFileObserver observer : observers) { observer.insertFile(); } } public void deleteFile() { System.out.println("删除一个文件"); for (IFileObserver observer : observers) { observer.deleteFile(); } } public boolean registerFileObserver(IFileObserver observer) { return observer != null && !observers.contains(observer) && observers.add(observer); } public boolean unregisterFileObserver(IFileObserver observer) { return observers.remove(observer); }
-
观察者接口
public interface IFileObserver { void insertFile(); void deleteFile(); }
-
观察者实现类
public class FileObserver implements IFileObserver { @Override public void insertFile() { System.out.println("监听到文件新增"); } @Override public void deleteFile() { System.out.println("监听到文件删除"); } }
-
情景类
public class Client { public static void main(String[] args) { // 被观察者 FileSystem fileSystem = new FileSystem(); // 观察者 FileObserver fileObserver = new FileObserver(); // 注册监听 fileSystem.registerFileObserver(fileObserver); fileSystem.insertFile(); } }