观察者模式(Observer Pattern)
一.定义
(一)观察者模式定义
- 简介:观察者模式也叫做发布订阅模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则其所有依赖于它的对象都会收到通知并自动更新。
1.Subject被观察者
- 定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责;
- 职责管理观察者和通知观察者。
2.Observer观察者
- 观察者接收到消息后,都进行update(更新)操作,对接收到的信息进行处理。
3.ConcreteSubject具体的被观察者
- 定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。
4.ConcreteObserver具体的观察者
- 每个观察者收到消息之后的处理逻辑不同
(二)示例
1.观察者(Observer)
/**
* 抽象观察者
*/
public interface Observer {
/**
* 处理逻辑
* @param ctx 接收数据上下文
*/
void dosomething(Object ctx);
}
2.被观察者(Subject)
public abstract class Subject {
//定义一个观察者集合
private Set<Observer> obsSet = new CopyOnWriteArraySet<>();
/**
* 新增一个观察者
* @param observer
*/
public void addObserver(Observer observer) {
obsSet.add(observer);
}
public void deleteObserver(Observer observer) {
obsSet.remove(observer);
}
/**
* 通知观察者可以执行逻辑了
* @param ctx
*/
public void notifyObserver(Object ctx) {
for (Observer observer : obsSet) {
observer.dosomething(ctx);
}
}
}
3.具体被观察者(ConcreteSubject)
/**
* 具体被观察者
*/
public class ConcreteSubject extends Subject {
public void dosomething(Object data) {
//TODO 前置处理data相关逻辑,然后通知观察者
super.notifyObserver(data);
}
}
4.具体观察者(ConcreteObserver)
/**
* 具体观察者
*/
public class ConcreteObserver1 implements Observer {
@Override
public void dosomething(Object data) {
//TODO 观察者处理data逻辑
System.out.println("observer1 handle data:" + data);
}
}
/**
* 具体观察者
*/
public class ConcreteObserver2 implements Observer {
@Override
public void dosomething(Object data) {
//TODO 观察者处理data逻辑
System.out.println("observer2 handle data:" + data);
}
}
5.高层模块使用
public class Invoker {
public static void main(String[] args) {
//创建一个被观察者
ConcreteSubject subject = new ConcreteSubject();
//定义观察者
Observer observer1 = new ConcreteObserver1();
Observer observer2 = new ConcreteObserver2();
//添加观察者
subject.addObserver(observer1);
subject.addObserver(observer2);
//执行
subject.dosomething("data.data.");
}
}
二.应用场景
【TODO】