系统内部存在多种单据时仓储层必然要实现很多XXDAO,XXDO之类的,用工厂方法将所有的数据层接口统一封装起来,可以让仓储层代码更具表达力,让使用仓储层的代码更简洁清晰。
仓储服务接口,对外暴漏基本增删改查方法。
public interface OrderRepository {
/*** insert order
*
* @param baseOrder order domain model
*/
public void store(BaseOrder baseOrder);
/**
* update order
*
* @param baseOrder order domain model
*/
public void update(BaseOrder baseOrder);
/**
* load order by order id
*
* @param serviceType service type
* @param orderId order id
* @return order domain model
*/
public BaseOrder load(ServiceTypeEnum serviceType, String orderId);
/**
* lock and return order by order id
*
* @param serviceType service type
* @param orderId order id
* @return order domain model
*/
public BaseOrder active(ServiceTypeEnum serviceType, String orderId);
}
仓储工厂,内部维护服务类型和仓储实现的映射,比如支付单使用支付单存储实现,具体的支付单仓储实现内部封装了支付单DAO做sql执行.
public class OderRepositoryFactory implements OrderRepository {
/** order repository map*/
private static Map<ServiceTypeEnum, OrderRepository> orderRepositoryMap = new HashMap<ServiceTypeEnum, OrderRepository>();
// init order repository map
static {
orderRepositoryMap.put(ServiceTypeEnum.PAY, new PayOrderRepository());
orderRepositoryMap.put(ServiceTypeEnum.REFUND, new PayOrderRepository());
}
@Override
public void store(BaseOrder baseOrder) {
OrderRepository repository = getRepositoryByServiceType(baseOrder.getServiceType());
repository.store(assetOrder);
}
@Override
public void update(BaseOrder baseOrder) {
OrderRepository repository = getRepositoryByServiceType(baseOrder.getServiceType());
repository.update(assetOrder);
}
@Override
public BaseOrder load(ServiceTypeEnum serviceType, String orderId) {
OrderRepository repository = getRepositoryByServiceType(serviceType);
return repository.load(orderId);
}
@Override
public BaseOrder active(ServiceTypeEnum serviceType, String orderId) {
OrderRepository repository = getRepositoryByServiceType(serviceType);
return repository.active(orderId);
}
/**
* find repository by service type
*
* @param serviceType service type
* @return order repository
*/
private OrderRepository getRepositoryByServiceType(ServiceTypeEnum serviceType) {
OrderRepository repository = orderRepositoryMap.get(serviceType);
AssertUtil.assertNotNull(repository,
String.format("Invalid serviceType[serviceType=%s].", serviceType.getCode()));
return repository;
}
}