vlambda博客
学习文章列表

设计模式------从dubbo源码中学习观察者模式

dubbo框架用到的设计模式之多,今天我们就结合dubbo源码来对观察者模式来进行学习,在dubbo源码中观察者模式主要体现在暴露服务时订阅数据部分,接下来我们结合订阅数据涉及到的类来对观察者模式进行学习。

我们知道服务暴露的订阅数据的开始方法在RegistryPtotocol.export方法中的registry.subscribe。此方法的最终实现是在RegistryProtocol.notify方法中。而我们是根据服务引用的流程来学习观察者模式,下面看下服务引用中订阅数据的流程图:

上面这张图就是服务引用部分中订阅数据涉及到的类之间的关系以及调用顺序,我们可以看到最终的实现部分是在RegistryDirectory.notify方法中,而此类却实现了NotifyListener接口的notify方法。通过调用顺序我们可以想到在服务引用过程中真正的订阅数据步骤是在RegistryDirectory.notify方法中,而AbstractRegistry.notify只是抽象出来方便其子类FailbackRegistry.doNotify对此方法尽心调用。这种方式就是通过一个接口、接口实现类、一个静态抽象类和继承静态抽象类的其他子类方法来实现的观察者模式。

接下来我们来根据菜鸟教程中对观察者模式的描述进行学习:

可以看到在菜鸟教程中是通过一个静态实现类和继承此静态类的子类来实现观察者模式的,即只采用静态类的方式实现。

通过菜鸟教程和dubbo源码,我们学习到了两种观察者模式的设计方式。希望可以帮助其他人更好的理解观察者模式。

现在来对观察者模式的作用和使用场景来做一个总结:

当对象之间存在一对多的关系时,我们可以采用观察者模式,当被观察者做出变化或者观察者对被观察者做出变化时,可以通知其他观察者也做出变化。

观察者模式经常用的场景,比如:在QQ中关注了其中一个好友,当这个好友的动态发生变化就会通知所有关注这个好友的人,在这个场景中被关注的人就是被观察者,而关注这个好友的人就是众多观察者。另一种场景是QQ中你对一条消息进行了点赞,当其他好友对这条消息进行点赞或者回复消息时,就会通知其他关注这条消息的好友进行变化。