概念
为细粒度对象提供粗粒度的外观来改进网络上的效率。
远程调用的开销很大,如数据可能需要编组,安全检查,数据包需要路由等等。
远程外观是一个粗粒度的外观,它建立在大量的细粒度对象之上。细粒度对象没有提供远程接口。
远程外观不包括领域逻辑,远程外观的功能只是把粗粒度的方法转换到底层的细粒度对象上。
运行机制
- 如地址对象中,远程外观采用getAddressData方法代替了常规的getCity等方法,充当了批量访问器。在比如一个订单外观可以获取一个订单及所有订单项,以及其他客户信息。
- 大量的数据传输需要一种传送方式,如果细粒度对象在传输两端并且是可以序列化的,则可以直接拷贝传输。
- 建议杜绝小粒度的远程外观,一般一个中型系统需要1个远程外观,对于一个大型系统需要6个左右的远程外观。
- 远程外观的设计基于特定客户的需要,最求用户操作的简单化,而不是简化系统,因此即使底层执行了相同的功能,远程外观的设计也可能不同。
- 远程外观区分有状态和无状态的,无状态的可以组成池提高效率,如B2C情况下,有状态的需要保持回话状态,可以利用客户会话状态模式和数据库会话状态模式。
- 远程外观中不应该包括领域逻辑。如需要工作流或者协作逻辑,可以单独创建一个非远端的事务脚本包含它。
- 和服务层的区别:服务层不需要远端,也不需要远程外观和数据传输对象。
使用时机
- 需要访问远程细粒度对象时,使用远程外观。
- 最常用的地方是在表现和领域模型之间,二者处于不同的进程中。
- 单一进程内部不需要远程外观,如客户领域模型和它的表现之间的通讯、Web服务器上的CGI脚本和领域模型之间的通讯。
- 远程外观模式意味着同步,即一个远程过程的调用是分布式的。可以借助异步和基于消息的远程通讯改善应用程序的相应速度。
示例-使用Java语言的会话bean来作为远程外观(java)
示例说明:通过一个远端接口,访问唱片数据,领域模型包括许多细粒度的对象:艺术家、唱片、曲目。另外还有其他一些包,为应用提供数据源。