最近同时在看《Core J2EE Patterns》跟ApacheOFBiz 源码,确实正如OFBiz官方介绍的那样,OFBiz应用了该书中的很多经典的设计模式。本篇结合OFBiz的源码试图总结一下其中用到的几个典型的Patterns。
典型的J2EE模式
业务代表模式
业务代表模式主要目的是用于隐藏业务逻辑对于调用端的实现,消除不同层次之间的耦合,它封装了业务服务的访问。OFBiz中对于业务代表模式的实现令人印象深刻,因为它在service跟entity engine层都实现了该模式。这里我们只讨论entity engine中的实现。
在org.ofbiz.entity下有一个Delegator接口,它就是其他层跟持久层打交道的入口。
OFBiz默认给出了一个实现:GenericDelegator:Delegator几乎提供了对所有数据访问需求的抽象,包括:数据缓存管理、事务管理、主键管理、查找、创建、更新、删除等。这有些颠覆我们想象中的开发模式,没错,这种方式跟我们通常的开发方式有些不一样。我们通常会基于数据库的设计来构建entity,然后基于每个entity构建DAO(或者把这个任务交给ORM框架)。但OFBiz不是这么做的(想象一下,如果它这么做了,它也实现不了现在的业务代表模式),在OFBiz entity engine中,并没有针对o-r mapping构建出来的entity,取而代之的是一个通用的、泛化的实体,而且不仅仅是如此,这里包括sql语句的组成部分都是被抽象过之后形成的“语义层”,通过XML配置来完成实体、关系的定义。这才给了OFbiz实现业务代表模式的可能。
它如何实现用一个业务代表,代理了所有数据访问?
我们看到它有两个名为getEntityHelper方法的重载,它们都返回GenericHelper对象。这里我们需要来了解几个entityengine内部的辅助对象:
GenericDAO:实现了