博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Spring+观察者模式处理绩效评定流程状态变更及邮件发送
阅读量:7038 次
发布时间:2019-06-28

本文共 3713 字,大约阅读时间需要 12 分钟。

   绩效评定流程在每月所有员工绩效计划打分结束后,由系统自动按评定关系表(树状结构,父结点是子结点的评定人,各部门总监为最底层评定人)发起任务,将最底层评定人下属的信息组装为表插入审批表单中,平行的最底层评定人为并行的子任务。最后一个平行最底层评定人评定结束后,系统会自动将新建子任务给平行最底层评定人的评定关系上层,并将所有平行最底层评定人的评定信息汇总作为审批表单,由此迭代直至找到平台级最终评定关系为止,流程结束。由于该流程极其特殊,既不是普通的并行或串行,也不是普通的子任务或会签,除发起结点、结束结点外,只有一个评定结点,所有评定人的评定活动均被看作评定结点的子任务,jbpm认为所有子任务均是并行关系,在业务逻辑中使用评定关系表等基础信息标识不同子任务的层级关系。由于无法使用统一的流程流转,在设计好流程及表单后,单独设计引擎驱动该流程,并在流程运转过程中更新基础信息表并负责发送邮件。

  单独的流程引擎设置、员工绩效基础信息表更新及邮件的发送由不同程序员开发。其中流程引擎在驱动流程运转过程中,会根据需要通知相应逻辑更新表及发送邮件。在开发引擎时,我使用观察者模式对流程进行重构使更新员工绩效基础信息和邮件发送逻辑的开发均独立进行,使代码的耦合进一步降低。

    在系统中存在这样的情况:一个功能点触发的动作会引起相关一个或者多个功能点在业务上进行对应的数据处理。而到底有几个功能点要做出相应,要看客户实施了哪些需要作出响应的具体功能点。

      例如:A功能点的某项业务会触发B、C、D三功能点做出回应,而客户订阅了哪些功能点是个未知数,也许客户不需要C功能点,对A功能点业务操作作出响应的仅有B、D。

      根据上面的需求可以得出,设计上要尽量的松散耦合,保持各功能点的独立性。观察者模式责无旁贷的跳了出来。

       我们的系统在整体上采用Spring framework来进行Bean管理。利用Spring通过配置文件来加载具体的类的方式——相当于被包装了的工厂,使得代码更加灵活。同样,观察者模式的应用可以很好的借用Spring framework提供的平台,变得更加灵活。

        首先,我们定义一个抽象的观察者

1
2
3
4
5
6
7
8
9
/**
 
* TODO(描述类的职责)
 
* @author chao.gao
 
* @date 2015年11月30日 上午8:50:59
 
* @version <b>1.0.0</b>
 
*/
public 
interface 
BaseObserverHandler 
extends 
Observer {
 
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 
* A class can implement the <code>Observer</code> interface when it
 
* wants to be informed of changes in observable objects.
 
*
 
* @author  Chris Warth
 
* @version %I%, %G%
 
* @see     java.util.Observable
 
* @since   JDK1.0
 
*/
public 
interface 
Observer {
    
/**
     
* This method is called whenever the observed object is changed. An
     
* application calls an <tt>Observable</tt> object's
     
* <code>notifyObservers</code> method to have all the object's
     
* observers notified of the change.
     
*
     
* @param   o     the observable object.
     
* @param   arg   an argument passed to the <code>notifyObservers</code>
     
*                 method.
     
*/
    
void 
update(Observable o, Object arg);
}

  具体观察者:

1
2
3
public 
class 
EndProcessMailSentHandler 
implements 
BaseObserverHandler{
//实际update方法,具体实现略
}

   在观察者模式中,目标角色是被客户程序调用,通过目标角色来通知具体观察者角色。在传统观察者模式中,目标角色中维护有一个观察者角色的列表,列表中的观察者角色通过其它程序进行添加维护——这就注定了观察者列表的改变会引起代码的修改。而通过Spring framework的配置方式注册观察者角色则避免了这种情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
 
* TODO(描述类的职责)
 
* @author chao.gao
 
* @date 2015年11月27日 下午4:15:36
 
* @version <b>1.0.0</b>
 
*/
public 
abstract 
class 
BaseObservedHandler 
extends 
Observable {
 
    
private 
List<BaseObserverHandler> observerHanlers;
 
    
/**
     
* 被观察者进行操作
     
* @author chao.gao
     
* @date 2015年11月27日 下午4:18:56
     
* @param context
     
*/
    
public 
void 
obServedOpertion(EvaluationPorcessContext context) {
        
if 
(observerHanlers == 
null 
|| observerHanlers.isEmpty())
            
return
;
        
for 
(BaseObserverHandler baseObserverHandler : observerHanlers) {
            
super
.addObserver(baseObserverHandler);
        
}
        
super
.notifyObservers(context);
    
}
 
    
/**
     
* 获得observerHanlers
     
* @return List<BaseObserverHandler>
     
*/
    
public 
List<BaseObserverHandler> getObserverHanlers() {
        
return 
observerHanlers;
    
}
 
    
/**
     
* 设置observerHanlers
     
* @param observerHanlers
     
*/
    
public 
void 
setObserverHanlers(List<BaseObserverHandler> observerHanlers) {
        
this
.observerHanlers = observerHanlers;
    
}
 
}

  下面是Spring framework配置文件的一个片断——它应该出现在用到目标角色的具体客户程序对应的Spring配置文件中。它将具体观察者的别名存放在一个list里面,使用Spring为生成的目标角色注入。

  如下:

1
2
3
4
5
6
7
8
9
10
11
12
<
bean 
id
=
"endProcessService"
        
class
=
"com.fx.oa.module.per.evaluation.workflow.server.service.impl.EndProcessService"
>
        
<
property 
name
=
"jbpmOperatorService" 
ref
=
"jbpmOperatorService" 
/>
        
<
property 
name
=
"evaluationProcessService" 
ref
=
"evaluationProcessService" 
/>
        
<
property 
name
=
"observerHanlers"
>
            
<
list
>
                
<
ref 
bean
=
"endProcessHandler"
/>
                
<
ref 
bean
=
"endProcessMailSentHandler" 
/>
                
<
ref 
bean
=
"endProcessSaveFormHandler"
/>
            
</
list
>
        
</
property
>
    
</
bean
>
     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1747203,如需转载请自行联系原作者
你可能感兴趣的文章
云存储解决方案日趋多样化
查看>>
IDC预测:2020年SDN市场规模将达到125亿美元
查看>>
看“风水反转”技术如何危害云安全
查看>>
密码重用的危害及规避方法
查看>>
致25岁的你:看看这些IT大佬 你还会放弃你的梦想吗
查看>>
英国发明睡眠传感器,助力改善睡眠质量
查看>>
传统家电品牌布局高端智能家居
查看>>
Ponemon Institute告诉你,大数据正在勾搭网络安全
查看>>
使用Jazz Automation编写自动化测试
查看>>
松下要造懒人必备智能家居:用平板指挥微波炉
查看>>
Colt进行网络升级 提供100Gbps光纤服务
查看>>
Php常用代码数据库的连接及读取和写入
查看>>
《响应式Web设计:HTML5和CSS3实践指南》——1.5节基于媒介查询的图像缩放
查看>>
Li-Fi无线技术揭秘:Wi-Fi的补充而非替代
查看>>
C Primer Plus 第6版 编程练习 2.12 答案
查看>>
有线电视的用户信息,成为美国黑客的新目标
查看>>
物联网智慧社区 衣食住行全智能
查看>>
高性能的Python扩展:第一部分
查看>>
Qt Linguist介绍
查看>>
Qt Creator快捷键
查看>>