1 概述
定义 观察者模式也叫作发布订阅模式,对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于他的对象都会得到通知并被自动更新。
subject 被观察者一般是抽象类,仅仅完成被观察者的基本实现:管理并通知观察者。
concretesubject 具体被观察者,定义自己的业务逻辑,同事定义对那些事件进行通知。
observer 观察者,收到消息后进行update方法
concreteobserver 具体观察者
2 优缺点
2.1 优点
观察者和被观察者之间是抽象耦合,扩展非常容易java已经实现了抽象级别的定义,java9被定义为过时
建立一套触发机制,观察者可以很好实现一套链条形式。
3 使用场景
关联行为场景。场景可拆分
事情多级触发场景
跨系统的消息交换场景
注意事项:一个类既可以是观察者也可以说被观察者,如果建立通知链较长,逻辑会比较复杂,可维护性变差。
4 代码案例
有三个角色,打工人,老板,hr
/**
* @author chiangtaol
* @date 2020-12-08
* @describe 打工人, 被老板观察者
*/
public class Laborer extends Observable {
public void doSomething(){
System.out.println("打工人要搞事情了..");
super.setChanged();
super.notifyObservers("xxx偷偷摸鱼");
}
}
/**
* @author chiangtaol
* @date 2020-12-08
* @describe 老板
*/
public class Boss extends Observable implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("老板获得情报:"+arg);
super.setChanged();
super.notifyObservers("开除掉xxx...");
}
}
/**
* @author chiangtaol
* @date 2020-12-08
* @describe 人力
*/
public class HR implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("hr接到老板通知:"+arg);
}
}
测试代码
@Test
void doSomething() {
Boss boss = new Boss();
Laborer laborer = new Laborer();
HR hr = new HR();
laborer.addObserver(boss);
boss.addObserver(hr);
// 打工人摸鱼
laborer.doSomething();
}
打工人是被观察者,老板是观察者也是被观察者,hr是观察者,一个短的消息链,执行结果如下:
打工人要搞事情了..
老板获得情报:xxx偷偷摸鱼
hr接到老板通知:开除掉xxx...