观察者模式在前端运用的很多,很多的框架rxjava,rxswift,rac 等都运用了观察者,这里我一直都是使用者但是并没有怎么深入的去研究实现的原理,经过学习,加上自己的理解,来接下笔记。
观察者模式的基本概念很简单,定义了对象之间的一对多依赖,让多个观察者对象同 时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(观察者)都会收到通 知并更新,属于行为型模式。
那么问题来了,如果自己手写的话,该如何设计,自己也参考资料,自己动手开始写一写。
首先监听对象 有一个监听回调,监听对象的方法调用,首先需要有个监听器,里面保存了监听者,被监听的方法,当被监听者调用了方法,触发了监听器,在保存的方法和属性中查找是否有方法,有的话,通知监听者。
自己根据jdk 自己手写了一个方便自己理解
创建监听器
public class HrObservable {
private Map<String,Object> map = new HashMap<>();
//首先需要保存方法的名字,和监听者对象
public void addListener(String methodName,Object object){
map.put(methodName,object);
}
//这里面方便content可以改成...args
public void notifactionMethod(String content,String notifacation){
//发送通知 根据通知找到对象
HrObserver object = (HrObserver) map.get(notifacation);
if (object == null){
return;
}
object.update(this,content);
//通过反射机制 调用该对象的监听方法
// object.getClass().getMethod(notifacation,String.class).invoke(object,content);
}
}
创建一个需要监听的类 把继承监听器
public class HrSource extends HrObservable {
public void doSometion(String content){
System.out.println("发起者做了某某事");
//暗号991
notifactionMethod(content,"991");
}
}
创建一个接口 规定被观察者发生改变时的回调
public interface HrObserver {
public void update(HrObservable o, Object arg);
}
添加一个观察者继承了上面的接口
public class ListenUser implements HrObserver{
@Override
public void update(HrObservable o, Object arg) {
System.out.println("获得的暗号是"+arg);
}
}
测试一下
public static void main(String[] args) {
HrSource source = new HrSource();
ListenUser listenUser = new ListenUser();
//这里设计还是有一点缺陷,只能一对一,但是也可以改成一对多,map里面的object可以改成list
//方便测试 我就没有修改
source.addListener("991",listenUser);
source.doSometion("我要去打篮球");
}
完全符合要求,和jdk一样,最后个人感觉,怎么和委派代理模式有点像呢,都是将要发生的事提前做一个监听回调。
这次代码还有很多的不完善地方,主要目的还是掌握观察者底层实现逻辑原理。不错,最后回过头来还是不复杂。