观察者模式(Observer Pattern)
定义
- 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
- 别名:模型-视图模式、源-收听者模式、从属者模式、发布-订阅模式。
- 观察者模式通过解耦观察者和被观察者,使得它们可以独立地变化和复用。
- 是行为型设计模式。
适用场景
- 当一个抽象模型包含两个方面内容,其中一个方面依赖于另一个方面;
- 其他一个或多个对象的变化依赖于另一个对象的变化;
- 实现类似于广播机制的功能,无需知道具体收听者,只需分发广播,系统中感兴趣的对象会自动接收该广播;
- 多层级嵌套使用,形成一种链式触发机制,使得事件具备跨域(跨越两种观察者类型)通知。
标准示例
观察者模式通常包含以下几个角色:
Subject(主题/被观察者):维护一个观察者列表,并提供注册、移除和通知观察者的方法。
Observer(观察者):定义一个更新接口,以便在得到主题通知时更新自己。
ConcreteSubject(具体主题):具体的被观察者,在内部状态改变时,通知所有注册的观察者。
ConcreteObserver(具体观察者):实现抽象观察者的定义,以便在得到主题状态更改通知时更新自身。
示例代码:
ISubject
抽象主题
/**
* 抽象主题
*/
public interface ISubject<E> {
boolean attach(IObserver<E> observer);
boolean detach(IObserver<E> observer);
void notify(E event);
}
IObserver
抽象观察者
/**
* 抽象观察者
*/
public interface IObserver<E> {
/**
* 更新
* @param event
*/
void update(E event);
}
ConcreteSubject
具体主题
/**
* 具体主题
*/
public class ConcreteSubject<E> implements ISubject<E>{
private List<IObserver