Copyright(c) DoYouHaoBaby.NET All Rights Reserved.
我们会经常遇到所创建的新应用需要和遗留软件或者其他独立应用相交互的情况。对领域建模器而言,这又是一个挑战。很多遗留应
用从前没有用领域建模技术构建,而且它们的模型模糊不清,难于理解,也很难使用。即使做得很好,遗留应用的模型对我们也不是
那么有用,因为我们的模型很可能与它完全不同。因此,在我们的模型和遗留模型之间就须要有一个集成层,这也是使用旧应用的需
求之一。
让我们的客户端系统和外面的系统交互有很多种方法。一种是通过网络连接,两个应用需要使用同一种网络通信协议,客户端需要遵
从使用外部系统使用的接口。另外一个交互的方法是数据库。外部系统使用存储在数据库里的数据。客户端系统被假定访问同样的数
据库。在这两个案例中,我们所处理的两个系统之间传输的都是原始数据。但是这看上去有些简单,事实是原始数据不包括任何和模
型相关的信息。我们不能将数据从数据库中取出来,全部作为原始数据处理。在这些数据后面隐含着很多语义。一个关系型数据库含
有和创建关系网的其他原始数据相关的原始数据。数据语义非常重要,并且需要被充分考虑。客户端应用不能访问数据库,也不能不
理解被使用数据的含义就进行写入操作。我们看到外部模型的部分数据被反映在数据库里,然后进入我们的模型。
如果我们允许这样的事情发生,那么就会存在外部模型修改客户端模型的风险。我们不能忽视和外部模型的交互,但是我们也应该小
心地将我们的模型和它隔离开来。我们应该在我们的客户端模型和外部模型之间建立一个防崩溃层。从我们模型的观点来看,防崩溃
层是模型很自然的一部分,并不像一个外部的什么东西。它对概念和行为的操作和我们的模型类似,但是防崩溃层用外部语言和外部
模型交流,而不是客户端语言。这个层在两个域和语言之间扮演双向转换器,它最大的好处在于可以使客户端模型保持纯洁和持久,
不会受到外部模型的干扰。
我们怎么实现防崩溃层?一个非常好的方案是将这个层看作从客户端模型来的一个服务。使用服务是非常简单的,因为它抽象了其他
系统并让我们在自己的范围内定位它。服务会处理所需要的转换,所以我们的模型保持独立。考虑到实际的实现,可以将服务看作比
作一个Facade ( 参见Gamma et al 在1995 年写作《设计模式》) 。除了这一点, 防崩溃层最可能需要一个适配器
(Adapter)。适配器可以使你将一个类的接口转换成客户端能理解的语言。在我们的这个例子中,适配器不需要一定包装类,因为它
的工作是在两个系统之间做转换。
如图:

防崩溃层也许包含多个服务。每一个服务都有一个相应的Facade,对每一个Facade 我们为之增加一个适配器。我们不应该为所有的
服务使用一个适配器,因为这样会使我们无法清晰地处理繁多的功能。
我们还必须再增加一些组件。适配器将外部系统的行为包装起来。
我们还需要对象和数据转换,这会使用一个转换器来解决。它可以是一个非常简单的对象,有很少的功能,满足数据转换的基本需
要。如果外部系统有一个复杂的接口,最好在适配器和接口之间再增加一个额外的Facade。这会简化适配器的协议,将它和其他系统
分离开来。
