一.定义
(一)观察者模式定义
- 简介:观察者模式也叫做发布订阅模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则其所有依赖于它的对象都会收到通知并自动更新。
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 {@Overridepublic void dosomething(Object data) {//TODO 观察者处理data逻辑System.out.println("observer1 handle data:" + data);}
}/*** 具体观察者*/
public class ConcreteObserver2 implements Observer {@Overridepublic 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】