分享
 
 
 

模式实践:观察者模式与Spring

王朝java/jsp·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

公司的项目告一段落,最近在进行RUP培训项目,有了些空闲的时间。闲暇浏览TheServerSide时,看到一篇名叫《Spring loaded Observer Pattern》的文章,不禁会心一笑——我已在两个月前应用到项目中了。而作者的观点也和我的观点吻合:the Spring framework is a great reason to continue design pattern advocacy in your projects.

下面我将自己在项目中应用的实例拿出来和大家分享,共同进步。

我将实际项目中的包名、业务逻辑代码屏蔽掉了,并进行了一定的简化。

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

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

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

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

首先创建了抽象观察者角色:

/**

* 抽象观察者,用于处理相关的记录

* @author Ai92

* </pre>

* Created on :2005-7-4 11:36:14

* </pre>

*/

public abstract class StaffingObserver {

public abstract void update (Map para)throws BaseException;

}

由于仅仅是举例,这里只列出一个具体观察者角色:

/**

* Concrete Subject具体观察者角色。这里省略了业务代码

* @author Ai92

* </pre>

* Created on :2005-5-30 14:59:11

* </pre>

*/

public class TerminateDispatch extends StaffingObserver {

/**

* @param staffRecordID

* @throws BaseException

* @author Ai92

* <pre>

* Created on :2005-5-30 14:59:11

* </pre>

*/

public void update(Map para) throws BaseException {

//……do same business act

}

private DispatchDAO dispatchDAO ;

/**

* @param dispatchDAO 设置 dispatchDAO

*/

public void setDispatchDAO(DispatchDAO dispatchDAO) {

this.dispatchDAO = dispatchDAO;

}

}

上面似乎没有什么特别之处。下面的代码就体现了在Spring framework下运用观察者模式的优势。

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

先看下目标角色(在系统中我忽略了抽象目标角色),与Spring framework有关的代码用紫色标示:

/**

* 目标角色,通知相应的观察者

* @author Ai92

* </pre>

* Created on :2005-7-4 13:08:26

* </pre>

*/

public class StaffingObservable {

……

/**

* 逐个获取观察者并通知他们来进行相应操作

* @param para 观察者执行必要参数

* @throws BaseException

* @author Ai92

* </pre>

* Created on :2005-7-4 20:29:17

* </pre>

*/

public void notifyForList(Map para) throws BaseException {

Iterator it = allConfig.iterator();

while (it.hasNext()) {

String property = (String) it.next();

StaffingObserver observer = (StaffingObserver) getBean(property);

if (observer != null)

observer.update(para);

else {

log.warn("bean '" + property + "'does not exist.");

}

}

}

private Object getBean(String beanName) {

return TbApplicationContext.getWac().getBean(beanName);

}

/**

* @param allConfig 设置 allConfig

*/

public void setAllConfig(List allConfig) {

this.allConfig = allConfig;

}

private List allConfig;

}

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

<!-- this the Spring config file for register Observers -->

<property name="obsevable">

<bean class="com.ai92.service.TestObservable"> <property name="allConfig">

<list>

<value>terminateDispatch</value>

<value>terminateParttime</value>

</list>

</property>

</bean>

</property>

下面要做的就是要将具体观察者的别名与每一个具体观察者的类关联起来:

<!-- the spring config file for Concrete Subject -->

<bean id="terminateDispatch" parent="baseTxProxy">

<property name="target">

<bean class="com.ai92.service.TerminateDispatch">

<property name="dispatchDAO">

<ref bean="dispatchDAO"/>

</property>

</bean>

</property>

</bean>

这样,一个完整的观察者模式便在Spring framework中搭建起来了。在Spring framework的协助下,观察着模式变得更加灵活了。但是也增加了使用难度和调试难度,如果没有良好的命名机制、有帮助的注释和文档,初来乍到的人恐怕很难找到问题的所在。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有