设计模式20:观察者模式(Observer)
2019-04-23 本文已影响0人
ygxing
1. 简介
- 观察者模式,又被成为发布订阅模式,
- 当一个对象的状态发生改变之后,会主动通知所有观察者,
- 然后每个观察者执行自己相应的函数
1.1 优点
- 被观察的对象和观察者之间解耦,方便扩展
- 观察者之间相互解耦,只是实现了共同接口
1.2 缺点
- 在单线程环境中,观察者收到通知的时间会比较长
1.3 使用场景
- 事件驱动模式:
按钮点击,页面刷新等等
- 广播模式:
系统启动时,通知各个组件
2.实现代码
这里使用了观察者模式的一个扩展模式,
也就是事件监听器模式来实现
2.1 具体逻辑
领导和老板都希望员工能好好工作,
就找人监听员工yanggx的工作状态,
当yanggx工作状态改变的时候,
监听者就会将事件汇报领导和老板,
这里就涉及到四个组成部分:事件源,事件,监听器和事件发布器
2.1.1事件源
yanggx这个人,对应的类是Yanggx
/**
* 事件源,也就是被监听的对象,
* 这里是yanggx这个人
*/
public class Yanggx {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
2.1.2事件
- yanggx所发生的事件,对应抽象类YanggxEvent
- 我们主要监听工作事件,所以只有一个实现类YanggxWorkEvent
/**
* yanggx事件
*/
public abstract class YanggxEvent extends EventObject {
private static final long serialVersionUID = -1336288592330402915L;
public YanggxEvent(Object source) {
super(source);
}
}
/**
* 工作事件
*/
public class YanggxWorkEvent extends YanggxEvent {
private static final long serialVersionUID = -4366933029591990461L;
public YanggxWorkEvent(Yanggx yanggx) {
super(yanggx);
}
}
2.1.3 监听器
- 就是对yanggx工作感兴趣的人,对应接口YanggxListener
- 对yanggx工作感兴趣的有大Boss,对应实现类YanggxBossListener,
- 还有上级领导也感兴趣,对应实现类YanggxLeaderListener
/**
* yanggx事件的监听器
*/
public interface YanggxListener<E extends YanggxEvent> extends EventListener {
/**
* 监听到事件之后,触发的动作
* @param event
*/
void onYanggxEvent(E event);
}
/**
* yanggx的老板监听器
*/
public class YanggxBossListener implements YanggxListener<YanggxEvent> {
@Override
public void onYanggxEvent(YanggxEvent event) {
Yanggx yanggx = (Yanggx) event.getSource();
System.out.println("Boss:我不认识他,所以不做任何处理");
}
}
/**
* yanggx的领导监听器
*/
public class YanggxLeaderListener implements YanggxListener<YanggxEvent> {
@Override
public void onYanggxEvent(YanggxEvent event) {
Yanggx yanggx = (Yanggx) event.getSource();
System.out.print("Leader:上班时间" + yanggx.getState() + "赶紧起来干活");
}
}
2.1.4事件发布器
就是将工作事件汇报给上级领导的人,对应的类是YanggxEventPublisher
/**
* 事件发布器
*/
public class YanggxEventPublisher {
List<YanggxListener<YanggxEvent>> listeners = new ArrayList<>();
/**
* 注册监听器
*
* @param listener
*/
public void registListener(YanggxListener<YanggxEvent> listener) {
listeners.add(listener);
}
/**
* 发布事件
*
* @param event
*/
public void publishEvent(YanggxEvent event) {
System.out.println("发布Yanggx事件开始...");
for (YanggxListener<YanggxEvent> listener : listeners) {
listener.onYanggxEvent(event);
}
}
}
2.2 类图
观察者模式2.3 代码测试
//测试类
public class ObserverTest {
public static void main(String[] args) {
// 事件源:yanggx
Yanggx yanggx = new Yanggx();
yanggx.setState("睡觉...");
// 事件
YanggxEvent event = new YanggxWorkEvent(yanggx);
// 在事件发布者中注册监听器
YanggxEventPublisher publisher = new YanggxEventPublisher();
publisher.registListener(new YanggxBossListener());
publisher.registListener(new YanggxLeaderListener());
// 发布事件
publisher.publishEvent(event);
}
}
运行结果:
发布Yanggx事件开始...
Boss:我不认识他,所以不做任何处理
Leader:上班时间睡觉...赶紧起来干活