1. 概念
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
2. 使用场景
观察者模式就是我们最常使用的按钮事件的模式,举例来说,我们软件上一个button,我们点击一下触发了click事件,当click时可能会触发后续的多个操作,按钮就是被依赖的对象,点击以后依赖于它的对象得到通知并做出反应,即被自动更新。
3. 类图
4. 代码示例
下面的代码讲述这么的事儿,一个小孩睡醒了就会哭,他身边的爸爸、妈妈和狗狗的反应...
- 事件:
abstract class Event<T> {
abstract T getSource();
}
class wakeUpEvent extends Event<Child>{
long timestamp;
String loc;
Child source;
public wakeUpEvent(long timestamp, String loc, Child source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
}
@Override
Child getSource() {
return source;
}
}
- 接口及实现类:
interface Observer {
void actionOnWakeUp(wakeUpEvent event);
}
class Dad implements Observer {
public void feed() {
System.out.println("dad feeding...");
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
feed();
}
}
class Mum implements Observer {
public void hug() {
System.out.println("mum hugging...");
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
hug();
}
}
class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
wang();
}
}
- 事件源:
/**
* 有很多时候,观察者需要根据事件的具体情况来进行处理
* 大多数时候,我们处理事件的时候,需要事件源对象
* 事件也可以形成继承体系
*/
class Child {
private boolean cry = false;
private List<Observer> observers = new ArrayList<>();
{
observers.add(new Dad());
observers.add(new Mum());
observers.add(new Dog());
observers.add((e)->{
System.out.println("ppp");
});
//hook callback function
}
public boolean isCry() {
return cry;
}
public void wakeUp() {
cry = true;
// 将事件源传递进去,有时候是为各个处理事件的对象对于不同的事件源做出不同的处理方式
wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed", this);
for(Observer o : observers) {
o.actionOnWakeUp(event);
}
}
}
- 场景类:
public class Main {
public static void main(String[] args) {
Child c = new Child();
// do sth
c.wakeUp();
}
}
5. 总结
以下全是观察者模式范畴
- Observer
- Listener
- Hook(钩子函数)
- Callback
————————————————————
坐标帝都,白天上班族,晚上是知识的分享者
如果读完觉得有收获的话,欢迎点赞加关注