05-25 IBM 汪振华
通过以上类图不难理解各个类之间的关系,下面补充说明
EventExecutor的两个实现类在具体项目中的作用和关系:EventExecutorImpl 是调用公式执行业务的实现类,被 EventProxy 关联,EventProxy 直接面向活动 受体(如:购物车管理类,订单管理类),由活动受体调用 EventProxy 的 execute 触发活动的执行。EventProxy 持有一个上下文 SyntaxContext 实例, EventProxy 接口方法被调用时,通过参数 EventCommand 将上下文传递给 EventExecutorImpl。
EventCommand接口的实现类中将存放公式能直接调用的外部函数的实现,由 EventProxy 统一注册到 SyntaxConext 上下文中,当公式调用 SyntaxConext 中 注册的外部函数时,也同时提供了操作 EventCommand 对象的受体 (通过 getTarget() 接口方法获取)并改变其状态的可能性。
图 5. 时序图
以下是 EventCommad 接口的一个实现类举例:
清单 8. 活动命令类
public class EventCommandImpl implements EventCommand {
private VariantContext context;// 公式活动上下文
private Object target;// 绑定对象:由公式函数操纵以改变其状态
private Map<String, FunctionIntf> funcMap = new HashMap<String, FunctionIntf>();
public EventCommandImpl() {
funcMap.put("addPoint", ADD_POINT);
funcMap.put("addCoupon", ADD_COUPON);
funcMap.put("addProduct", ADD_PRODUCT);
}
public EventCommandImpl(VariantContext context) {
this();
this.context = context;
}
/**
* 为指定用户添加积分
* params[0]: 用户 ID, params[1]: 积分数 , params[2]: 到期时间(可选)
*/
public final FunctionIntf ADD_POINT = new FunctionIntf() {
public Object execute(java.util.List params) {
if(null != this.getTarget() && null != params && params.size() > 1){
ShopCartManager scm = (ShopCartManager) this.getTarget();
MetaElement pmMbId = (MetaElement) params.get (0);
MetaElement pmPointSum = (MetaElement) params.get(1);
scm.addPoint(pmMbId.getAsLong (),pmPointSum.getAsDouble());
}
return null;
}
};
/**
* 送优惠券
* params[0]: 用户 ID,params[1]: 优惠券 ID
*/
public final FunctionIntf ADD_COUPON = new FunctionIntf() {
public Object execute(java.util.List params) {
if(null != this.getTarget() && null != params && params.size() > 1){
ShopCartManager scm = (ShopCartManager) this.getTarget();
MetaElement pmMbId = (MetaElement) params.get (0);
MetaElement pmCouponId = (MetaElement) params.get(1);
scm.addCoupon(pmMbId.getAsLong (),pmCouponId.getAsLong());
}
return null;
}
};
/**
* 送赠品
* params[0]: 用户 ID,params[1]: 商品 ID
*/
public final FunctionIntf ADD_PRODUCT = new Funct
|