《JAVA与模式》第14天―桥梁模式 (二)

2014-11-24 08:27:04 · 作者: · 浏览: 1
上所有带业务流程处理的系统都会有这样的功能,比如OA上有尚未处理完毕的文件,需要发送一条消息提示他。
  从业务上看,消息又分成普通消息、加急消息和特急消息多种,不同的消息类型,业务功能处理是不一样的,比如加急消息是在消息上添加加急,而特急消息除了添加特急外,还会做一条催促的记录,多久不完成会继续催促;从发送消息的手段上看,又有系统内短消息、手机短信息、邮件等。
使用桥梁模式来解决问题
  根据业务的功能要求,业务的变化具有两个维度,一个维度是抽象的消息,包括普通消息、加急消息和特急消息,这几个抽象的消息本身就具有一定的关系,加急消息和特急消息会扩展普通消息;另一个维度是在具体的消息发送方式上,包括系统内短消息、邮件和手机短消息,这几个方式是平等的,可被切换的方式。



 
  现在出现问题的根本原因,就在于消息的抽象和实现是混杂在一起的,这就导致了一个纬度的变化会引起另一个纬度进行相应的变化,从而使得程序扩展起来非常困难。
  要想解决这个问题,就必须把这两个纬度分开,也就是将抽象部分和实现部分分开,让它们相互独立,这样就可以实现独立的变化,使扩展变得简单。抽象部分就是各个消息的类型所对应的功能,而实现部分就是各种发送消息的方式。按照桥梁模式的结构,给抽象部分和实现部分分别定义接口,然后分别实现它们就可以了。


 源代码
  抽象消息类
[java]
1. package com.bankht.Bridge.bridgeMessage;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-26 下午05:26:06
6. *
7. * @类说明 :抽象消息类
8. */
9. public abstract class AbstractMessage {
10. // 持有一个实现部分的对象
11. MessageImplementor impl;
12.
13. /**
14. * 构造方法,传入实现部分的对象
15. *
16. * @param impl
17. * 实现部分的对象
18. */
19. public AbstractMessage(MessageImplementor impl) {
20. this.impl = impl;
21. }
22.
23. /**
24. * 发送消息,委派给实现部分的方法
25. *
26. * @param message
27. * 要发送消息的内容
28. * @param toUser
29. * 消息的接受者
30. */
31. public void sendMessage(String message, String toUser) {
32. this.impl.send(message, toUser);
33. }
34. }


  普通消息类
[java]
1. package com.bankht.Bridge.bridgeMessage;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-26 下午05:27:22
6. *
7. * @类说明 :普通消息类
8. */
9. public class CommonMessage extends AbstractMessage {
10.
11. public CommonMessage(MessageImplementor impl) {
12. super(impl);
13. }
14.
15. @Override
16. public void sendMessage(String message, String toUser) {
17. // 对于普通消息,直接调用父类方法,发送消息即可
18. super.sendMessage(message, toUser);
19. }
20. }


  加急消息类
[java]
1. package com.bankht.Bridge.bridgeMessage;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-26 下午05:27:43
6. *
7. * @类说明 :加急消息类
8. */
9. public class UrgencyMessage extends AbstractMessage {
10.
11. public UrgencyMessage(MessageImplementor impl) {
12. super(impl);
13. }
14.
15. @Override
16. public void sendMessage(String message, String toUser) {
17. message = "加急:" + message;
18. super.sendMessage(message, toUser);
19. }
20.
21. /**
22. * 扩展自己的新功能,监控某消息的处理状态
23. *
24. * @param messageId
25. * 被监控的消息编号
26. * @return 监控到的消息的处理状态
27. */
28. public Object watch(String messageId) {
29. // 根据消息id获取消息的状态,组织成监控的数据对象,然后返回
30. return null;
31. }
32. }


  实现发送消息的统一接口
[java]
1. package com.bankht.Bridge.bridgeMessage;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-26 下午05:28:04
6. *
7. * @类说明 :实现发送消息的统一接口
8. */
9. public interface MessageImplementor {
10. /**
11. * 发送消息
12. *
13. * @param message
14. * 要发送消息的内容
15. * @param toUser
16. * 消息的接受者
17. */
18. public void send(String message, String toUser);
19. }

 系统内短消息的实现类
[java]
1. package com.bankht.Bridge.bridgeMessage;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-26 下午05:28:25
6. *
7. * @类说明 :系统内短消息的实现类
8. */
9. public class M