黑板模式是一种常用的架构模式,是观察者模式的一个扩展,应用中的多种不同数据处理逻辑相互影响和协同来完成数据分析处理。允许消息的读写同时进行,广泛地交互消息。就好像多位不同的专家在同一黑板上交流思想,每个专家都可以获得别的专家写在黑板上的信息,同时也可以用自己的分析去更新黑板上的信息,从而影响其它专家。比如A观察了B、C、D、E、F这么多个对象,按照观察者模式,当B、C、D、E、F中某个对象状态改变时,通过初始化一个A对象然后利用A对象去调用operation操作。但是在黑板模式中是这样,B、C、D、E、F一旦状态改变,它会将其记录在一个类似黑板的统一中央数据中,然后A对象只需从黑板上关注自己的观察对象状态是否发生改变,一旦有改变则调用operation()操作。
黑板模式一般不会对架构产生什么影响,但它通常会要求有一个清晰的消息结构。黑板模式一般都会提供一系列的过滤器,以便消息的消费者不再接触到与自己无关的消息。在实际开发中,黑板模式常见的有两种实现方式:
数据库作为黑板
利用数据库充当黑板,生产者更新数据信息,不同的消费者共享数据库中信息,这是最常见的实现方式。该方式在技术上容易实现,开发量较少,熟悉度较高。缺点是在大量消息和高频率访问的情况下,性能会受到一定影响。在该模式下,消息的读取是通过消费者主动“拉取”,因此该模式也叫做“拉模式”。
消息队列作为黑板
以消息队列作为黑板,通过订阅-发布模型即可实现黑板模式。这也是黑板模式被淡忘的一个重要原因:消息队列(Message Queue)已经非常普及了,做Java开发的已经没有几个不知道消息队列的。在该模式下,消费者接收到的消息是被主动推送过来的,因此该模式也称为“推模式”。
优点:可以有效应用于实时性要求较高的系统,这种实现工作在“推模式”下。