知识卡片

映射器最大的实现难点:如何被激活

普通读书笔记卡

内容

映射器是两个必须彼此隔离的子系统之间的绝缘层——它负责两个子系统间的通信细节,但这两个子系统都完全感知不到映射器的存在(这一点比调停者更彻底:用调停者时,各对象虽然互不相识,但至少知道调停者的存在;映射器隔离的双方甚至连映射器本身都不知道)。映射器一旦真正运行起来,具体怎么在两层之间搬运数据是很直观的事,真正的难点在于它该如何被激活——因为按照定义,你不能从被映射的任何一方子系统里直接去调用映射器(那样就等于让这一方知道了映射器的存在,违反了隔离的初衷)。解法主要有两种:一是引入第三方子系统来触发映射并调用映射器,让激活的职责落在两个被隔离方之外的第三者身上;二是让映射器扮演其中一个子系统的观察者角色,被动地监视这个子系统内部发生的事件,事件一旦触发就顺势调用映射器完成工作。企业应用里最常见的映射器实例就是数据映射器(负责领域对象和数据库之间的映射)。使用映射器还是更简单的入口来解耦两个部分,取决于隔离的严格程度要求:入口无论写起来还是用起来都比映射器简单得多,因此是更常见的默认选择;只有当子系统之间的交互本身很复杂、且这份交互逻辑相对独立于两个子系统各自的核心目标时,才真正值得上映射器这种更彻底但也更麻烦的隔离方式。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第18章 基本模式"之"18.2.1 运行机制"(源文件:_epub-src/OEBPS/Text/000213.html) - 结论依据:原文说明"映射器的使用难点在于如何激活,因为你无法在被映射子系统中的任何一方直接调用它。有时可以使用一个第三方的子系统来完成映射并调用映射器。另一个可选的方案是让映射器成为某个子系统的观察者……通过监视子系统中发生的事件,映射器就可以调用了",直接支撑本卡结论。 - 原始内容:即使使用一个调停者的多个对象之间并不互相认识,但它们知道调停者的存在;而映射器隔离的对象甚至不能感知到映射器的存在。