以 Purchase Order 模块为例:
当Purchase Order 的状态改变时,会引起几个domain 类的变化,那么还要
使用观察者模式。
但是如果变化是已知的,或者说 PO的 status 的变化只集中在 purchase 模块中的
话,
那可以不使用观察者模块。
关于如何使用观察者模式,请参考7.9 节
代码如下:
1、新建若干个状态变换接口,代码例子如下
public interface ClosedAction
{
boolean isCloseable(PurchaseOrder obj);
void execute(PurchaseOrder obj);
}
2、在Service 实现类中加如下代码
@Setter
private OrderStatusTransferAction statusTransferaAction;
public void changeStatus(int id, StatusType status)
{
PurchaseOrder order = this.get(id);
if(order == null) {
throw new PurchaseException(PurchaseEnum.PONotFound);
}
statusTransferaAction.transfer(status, order);
}
3、 将OrderStatusTransferAction 单独出来的原因是:为了方便扩充观察者模式 和
降低service 层的复杂度。对应的代码如下:
public class OrderStatusTransferAction{
@Setter
private ClosedAction closeAction;
public void transfer(StatusType formStatus, PurchaseOrder obj) {
if(formStatus == StatusType.Closed) {
if(closeAction.isCloseable(obj)) {
closeAction.execute(obj);
}
}
}
}
4、在Purchase Order的bean 中添加配置:closeActionImpl 是 CloseAction 接口的
实现类
<bean name="purchaseOrderService" class="com.optiongroupinc.erp.purchase.service.impl.PurchaseOrderServiceImpl">
<constructor-arg ref="purchaseOrderDao"></constructor-arg>
<property name="statusTransferaAction" ref="statusTransferaAction"></property>
</bean>
<bean name="statusTransferaAction" class="com.optiongroupinc.erp.purchase.order.service.OrderStatusTransferAction">
<property name="closeAction" ref="closeActionImpl"/>
</bean>
代码如下:
1、新建一个接口
public interface PurchaseOrderDeleteAction
{
boolean isDeletable(PurchaseOrder purchaseOrder);
void deleteAction(PurchaseOrder po);
}
2、在Service 实现类中加如下代码
@Setter
private List<PurchaseOrderDeleteAction> actions;
@Override
public void delete(Integer id)
{
if (actions != null)
{
for (PurchaseOrderDeleteAction action : actions)
{
if (!action.isDeletable(get(id)))
{
throw new PurchaseException(PurchaseEnum.POCanNotDeleted);
}
}
for (PurchaseOrderDeleteAction action : actions)
{
action.deleteAction(get(id));
}
}
super.delete(id);
}
3、在Purchase Order的bean 中添加配置
<bean name="purchaseOrderService" class="com.optiongroupinc.erp.purchase.service.impl.PurchaseOrderServiceImpl">
<constructor-arg ref="purchaseOrderDao"></constructor-arg>
<property name="actions">
<list>
<ref bean="..." /><!-- 对应的删除验证 bean -->
<ref bean="..." /><!-- 对应的删除验证 bean -->
</list>
</property>
</bean>