观察者模式
定义
定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖与他的对象都会得到通知并被自动更新。
- Subject:被观察者,定义被观察者必须实现的职责,必须能过动态的增加、取消观察者,一般是抽象类或者实现类,管理观察者并通知观察者。
- Observer:观察者,观察者接收到消息后进行更新操作,对接收到的信息进行处理。
- ConcreteSubject:具体被观察者,定义被观察者自己的业务逻辑,同时定义对那些事件进行通知。
- ConcreteObserver:具体观察者,观察者自己的业务逻辑。
具体实现
1 | public interface Observer { |
被观察者:
1 | public abstract class Subject { |
被观察者实现:
1 | public class ConcreteSubject extends Subject { |
测试:
1 | public class Main { |
优点
- 观察者和被观察者之间是抽象耦合的
- 目标与观察者之间建立了一套触发机制。
缺点
- 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
应用场景
- 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。
- 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时,可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
Java提供了java.util.Observable实现类和java.util.Observer接口。上面的被观察者类和观察者接口可以用java提供的api代替了。
1 | public class ObserverApi implements Observer { |
代码:GitHub
欢迎关注公众号: