《程序员修炼之道:从小工到专家》第五章:弯曲或折断(2)

四、它只是视图

一旦你基于责任把程序划分成不同模块,你就有了新的问题,在运行时,对象怎样相互交谈?你怎样管理它们之间的逻辑依赖?也就是说,你怎样对这些不同对象中的状态的变化进行同步?

我们将从事件的概念开始。

一个事件就是一条特殊的消息,说明“刚刚发生了某件有趣的事情”,我们可以用事件把某个对象的状态变化通知给可能感兴趣的其他对象。这样使用事件使得那些对象之间的耦合得以减至最少——事件发送者不需要对接收者有任何明确的了解。事实上,可以存在多个接收者,每个接收者都专注于自己的“议事日程”。

发布/订阅

对象应该进行登记,只接收他们需要的事件,并且决不应该收到它们不需要的事件。

如果我们对某个Publisher生成的特定事件感兴趣,我们所需要做的只是登记我们自己,Publisher追踪所有感兴趣的Subscriber对象;当Publisher生成有趣的事件时,它将依次调用每个Subscriber,通知它们该事件已经发生。

Model-View-Controller(MVC

既让模型与表示模型的GUI分离,也让模型与管理视图的控件分离。

使视图与模型分离。

通过松解模型与视图/控制器之间的耦合,你用廉价的代价为自己换来了许多灵活性。

超越GUI

MVC是一种通用的编程技术,视图是对模型的一种解释——它无需是图形化的。控制器更是一种协调机制,不一定要与任何种类的输入设备有关。

  • 模型:表示目标对象的抽象数据类型。
  • 视图:解释模型的方式。它订阅模型中的变化和来自控制器的逻辑事件。
  • 控制器:控制视图、并向模型提供新数据的途径。它既向模型、也向视图发布事件。

仍然有耦合

尽管我们在减少耦合方面取得了进展,侦听者和事件发生者相互之间仍有一些了解。

五、黑板

字迹在墙上······

黑板系统让我们完全解除了我们的对象之间的耦合,并提供了一个“论坛”,知识消费者和生产者可以在那里匿名、异步地交换数据。

黑板实现

基于计算机的黑板系统最早是为在人工智能中应用而发明的,在那样的应用中,要解决的问题大而复杂——语音识别、基于知识的推理系统,等等。

我们可以存储对象,可以使用黑板对象基于对象流、而不仅仅是数据的算法,就好像我们的侦探能够让证人自己站到黑板前,而不仅仅是陈述。任何人可以提出与案情相关的问题,张贴笔录,并让证人走到黑板的另一个区域,在那里他也会做出不同的响应。

像这样的系统的一大好处是你与黑板有单一、一致的接口。

在侦探们处理大案时,黑板可能变得混乱,可能很难在黑板上确定资料的位置。解决方案是对黑板进行分区,并开始以某种方式组织黑板上的资料。

不同的软件系统以不同的方式处理这样的分区,有些使用几乎只有一级的区域或兴趣组,而另一些则采用更加层次化的树状结构。

黑板方式的编程消除了对太多接口的需要,从而能带来更优雅、更一致的系统。

应用实例

用黑板协调工作流。

我们可以用黑板协调完全不同的事实和因素,同时又使各参与方保持独立、甚至隔离。

学院君

学院君 has written 550 articles

资深PHP工程师,Laravel学院院长