设为首页
收藏本站
开启辅助访问
切换到窄版
登录
立即注册
中问网首页
我的收藏
站长博客
搜索
搜索
本版
帖子
用户
第一问答网
»
论坛
›
中问网
›
问答
›
研磨设计模式之桥接模式-1
返回列表
发新帖
研磨设计模式之桥接模式-1
[复制链接]
11
|
0
|
2014-1-22 13:39:00
|
显示全部楼层
|
阅读模式
来写一个大家既陌生又熟悉的设计模式,也是非常实用的一个设计模式,那就是桥接模式。
说陌生是很多朋友并不熟悉这个设计模式,说熟悉是很多人经常见到或者是下意识的用到这个设计模式,只是不知道罢了。桥接模式是非常实用的一个模式,下面就来写写它。
桥接模式(Bridge)
1场景问题
1.1发送提示消息
考虑这样一个实际的业务功能:发送提示消息。基本上所有带业务流程处理的系统都会有这样的功能,比如某人有新的工作了,需要发送一条消息提示他。
从业务上看,消息又分成普通消息、加急消息和特急消息多种,不同的消息类型,业务功能处理是不一样的,比如加急消息是在消息上添加加急,而特急消息除了添加特急外,还会做一条催促的记录,多久不完成会继续催促。从发送消息的手段上看,又有系统内短消息、手机短消息、邮件等等。
现在要实现这样的发送提示消息的功能,该如何实现呢?
1.2不用模式的解决方案
1:实现简化版本
先考虑实现一个简单点的版本,比如:消息先只是实现发送普通消息,发送的方式呢,先实现系统内短消息和邮件。其它的功能,等这个版本完成过后,再继续添加,这样先把问题简单化,实现起来会容易一点。
(1)由于发送普通消息会有两种不同的实现方式,为了让外部能统一操作,因此,把消息设计成接口,然后由两个不同的实现类,分别实现系统内短消息方式和邮件发送消息的方式。此时系统结构如图1所示:
[img][/img]
图1简化版本的系统结构示意图
下面看看大致的实现示意。
(2)先来看看消息的统一接口,示例代码如下:
/**
* 消息的统一接口
*/
public interface Message {
/**
* 发送消息
* @param message 要发送的消息内容
* @param toUser 消息发送的目的人员
*/
public void send(String message,String toUser);
}
(3)再来分别看看两种实现方式,这里只是为了示意,并不会真的去发送Email和站内短消息,先看站内短消息的方式,示例代码如下:
/**
* 以站内短消息的方式发送普通消息
*/
publicclass CommonMessageS MS implements Message{
public void send(String message, String toUser) {
System.out.println("使用站内短消息的方式,发送消息'"
+message+"'给"+toUser);
}
}
同样的,实现以Email的方式发送普通消息,示例代码如下:
/**
* 以Email的方式发送普通消息
*/
public class CommonMessageEmail implements Message{
public void send(String message, String toUser) {
System.out.println("使用Email的方式,发送消息'"
+message+"'给"+toUser);
}
}
2:实现发送加急消息
上面的实现,看起来很简单,对不对。接下来,添加发送加急消息的功能,也有两种发送的方式,同样是站内短消息和Email的方式。
加急消息的实现跟普通消息不同,加急消息会自动在消息上添加加急,然后再发送消息;另外加急消息会提供监控的方法,让客户端可以随时通过这个方法来了解对于加急消息处理的进度,比如:相应的人员是否接收到这个信息,相应的工作是否已经开展等等。因此加急消息需要扩展出一个新的接口,除了基本的发送消息的功能,还需要添加监控的功能,这个时候,系统的结构如图2所示:
[img][/img]
图2加入发送加急消息后的系统结构示意图
(1)先看看扩展出来的加急消息的接口,示例代码如下:
/**
* 加急消息的抽象接口
*/
public interface UrgencyMessage extends Message{
/**
* 监控某消息的处理过程
* @param messageId 被监控的消息的编号
* @return 包含监控到的数据对象,这里示意一下,所以用了Object
*/
public Object watch(String messageId);
}
(2)相应的实现方式还是发送站内短消息和Email两种,同样需要两个实现类来分别实现这两种方式,先看站内短消息的方式,示例代码如下:
public class UrgencyMessageS MS implements UrgencyMessage{
public void send(String message, String toUser) {
message = "加急:"+message;
System.out.println("使用站内短消息的方式,发送消息'"
+message+"'给"+toUser);
}
public Object watch(String messageId) {
//获取相应的数据,组织成监控的数据对象,然后返回
return null;
}
}
再看看Emai的方式,示例代码如下:
public class UrgencyMessageEmail implements UrgencyMessage{
public void send(String message, String toUser) {
message = "加急:"+message;
System.out.println("使用Email的方式,发送消息'"
+message+"'给"+toUser);
}
public Object watch(String messageId) {
//获取相应的数据,组织成监控的数据对象,然后返回
return null;
}
}
(3)事实上,在实现加急消息发送的功能上,可能会使用前面发送不同消息的功能,也就是让实现加急消息处理的对象继承普通消息的相应实现,这里为了让结构简单一点,清晰一点,所以没有这样做。
1.3有何问题
上面这样实现,好像也能满足基本的功能要求,可是这么实现好不好呢?有没有什么问题呢?
咱们继续向下来添加功能实现,为了简洁,就不再去进行代码示意了,通过实现的结构示意图就可以看出实现上的问题。
1:继续添加特急消息的处理
特急消息不需要查看处理进程,只要没有完成,就直接催促,也就是说,对于特急消息,在普通消息的处理基础上,需要添加催促的功能。而特急消息、还有催促的发送方式,相应的实现方式还是发送站内短消息和Email两种,此时系统的结构如图3所示:
[img][/img]
图3加入发送特急消息后的系统结构示意图
仔细观察上面的系统结构示意图,会发现一个很明显的问题,那就是:通过这种继承的方式来扩展消息处理,会非常不方便。
你看,实现加急消息处理的时候,必须实现站内短消息和Email两种处理方式,因为业务处理可能不同;在实现特急消息处理的时候,又必须实现站内短消息和Email这两种处理方式。
这意味着,以后每次扩展一下消息处理,都必须要实现这两种处理方式,是不是很痛苦,这还不算完,如果要添加新的实现方式呢?继续向下看吧。
2:继续添加发送手机消息的处理方式
如果看到上面的实现,你还感觉问题不是很大的话,继续完成功能,添加发送手机消息的处理方式。
仔细观察现在的实现,如果要添加一种新的发送消息的方式,是需要在每一种抽象的具体实现里面,都要添加发送手机消息的处理的。也就是说:发送普通消息、加急消息和特急消息的处理,都可以通过手机来发送。这就意味着,需要添加三个实现。此时系统结构如图4所示:
[img][/img]
图4加入发送手机消息后的系统结构示意图
这下能体会到这种实现方式的大问题了吧。
3:小结一下出现的问题
采用通过继承来扩展的实现方式,有个明显的缺点:扩展消息的种类不太容易,不同种类的消息具有不同的业务,也就是有不同的实现,在这种情况下,每个种类的消息,需要实现所有不同的消息发送方式。
更可怕的是,如果要新加入一种消息的发送方式,那么会要求所有的消息种类,都要加入这种新的发送方式的实现。
要是考虑业务功能上再扩展一下呢?比如:要求实现群发消息,也就是一次可以发送多条消息,这就意味着很多地方都得修改,太恐怖了。
那么究竟该如何实现才能既实现功能,又能灵活的扩展呢?
《研磨设计模式》一书已经上市,卓越网销售链接:
[url=]
[color=]http://www.amazon.cn/%E7%A0%94%E7%A3%A8%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E9%99%88%E8%87%A3/dp/B004G8P90S/ref=sr_1_1?ie=UTF8&qid=1295358211&sr=8-1
[/url]
也可以直接在卓越网上搜索《研磨设计模式》
当当网的销售链接:[url=]http://product.dangdang.com/product.aspx?product_id=20994349&ref=search-0-mix[/url]
========未完待续
---------------------------------------------------------------------------
[url=]私塾在线学习网[/url]原创内容跟着cc学设计系列 之 [url=]研磨设计模式[/url]
原创内容,转载请注明出处【[url=]http://sishuok.com/forum/blogPost/list/106.html[/url]】
---------------------------------------------------------------------------
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
千问
主题
0
回帖
4882万
积分
论坛元老
论坛元老, 积分 48824836, 距离下一级还需 -38824837 积分
论坛元老, 积分 48824836, 距离下一级还需 -38824837 积分
积分
48824836
加好友
发消息
回复楼主
返回列表
问答
热门排行
1
一下我长时间接触锌盐酸硫酸硫脲等化学物品对生育影响
2
宝宝打完预防针之后流鼻涕打喷嚏
3
昨晚吃了欣康,今天做心脏造影,影响结果吗
4
手老起泡,还起皮,皮肤变黄。。。。。
5
经常腰腿痛,我该怎么办?
6
尖锐湿疣平时该注意什么?
7
偶尔小肚子痛,但一会儿就好了
8
初三女孩15岁,作业多,眼疲劳
9
月经不来、白带是咖啡色、
10
肘和膝部出现红斑并搔痒是什么原因?急求治
11
下体流黄色液体这是什么情况
12
孩子长的矮,是什么因素
13
梅毒是由什么原因而引起的?
14
我的宝贝满月,宝贝出院时,医生开了维生素AD滴剂
15
孩子面临中考可有早恋迹象想得到帮助
16
如何知道是否患乙肝,请医生帮忙看下化验单
17
额头起小白泡
18
腹痛头晕眼黑
19
子宫出血,时间长,吃药挂针都不能止血。
20
喝酒对食管癌患者有影响吗?
21
晚上睡觉时明明自己意识清醒但是就是动不了
22
求排卵期是几号
23
感觉吃了东西没消化堵在喉咙
24
这次例假已经快一个月了,刚开始量一直很少
25
药流25后大量出血还有很多血块
26
24男患有腰椎间盘突出右腿痛的厉害!小腿
27
没有想事情睡不着闻苹果香味也不管用
28
梅毒的传染性强吗?
29
我并没有痔疮啥的,怎么会便血
30
三岁宝宝经常流鼻涕是怎么回事?
31
外阴有红疙瘩,晚上痒有时候还疼,
32
上厕所拉出来的只有一点稀水状的大便,总有便意
33
精索曲张二度是否影响性欲
34
怀孕4个月发现洋水有点浑浊
35
上个月15号的月经,现在还没来,没有性生活
36
我的左侧乳房下面一点点位置有点肿,是什么
37
心悸,怠倦,全身无力
38
身体无力没精神食欲不振
39
怀孕一个月,炖鸡可以放冬虫夏草吗?已经放
40
得了不孕不育要怎么治疗?
41
我爷爷和他的孩子都有乙肝
42
我的心事让我好累,想找个心理专家
43
耳鸣健忘多梦舌边有齿状
44
我大便特别的疼是不是肛裂的症状啊?
45
尾巴股骨折两个月是否能同方
46
生殖器疱疹病因是什么啊?
47
特别烦躁,心慌总治不好
48
导致直肠癌的因素有什么?
49
车祸导致颅部上下额骨骨折
50
生完宝宝一个月了可以吃海参吗
51
身上有疤痕能不能打耳洞
52
,我的宝宝九个月了但是最近都不好好喝奶我
53
希望得到解答,有意接受治疗
54
我怀孕前一个月拉头发了只是拉前边刘海
55
手术后脚为什么会出现疼痛?
56
常年便秘,需要靠泻药怎么办
57
生殖器疱疹是什么啊?
58
一般哪里会长血管瘤?
59
长期性耳鸣该如何治疗
60
六个月的宝宝发热滴注林可霉素过量会有什么
61
小孩吃蜂蜜好不好两岁半
62
做了孕前检查尿常规10BC+这个不懂
63
生殖器疱疹不通过性生活能传播吗?
64
现在女孩应该多大年龄来月经
65
反复发烧,头疼,呕吐怎么办?
66
结肠癌手术后还能活多久啊?
67
吃点东西都饱了,经常肚子痛,感觉涨
68
肚脐上边经常会在晚上疼
69
我一个月来三次月经是怎么回事????以前
70
为什么孩子吃母乳屁股总是流黄水
71
鸡鸡小还细还包皮
72
小腹痛不是很痛有半个月了无腹泻什么原因
73
治疗风湿病的药物主要有哪些?
74
双眼看见双影以及头晕
75
胎儿的好坏可以检测吗?
76
怀孕37周脐动脉S/D3.6危险吗?
77
关于输卵管检查,造影有损伤吗?
78
宝宝得支气管肺炎,总共打了十多天吊针
79
气管低分化鳞癌晚期
80
肚子一受凉就很容易放屁是怎么回事
81
我女儿11岁每个月两次月经量大怎么回事
82
少量精油与娃哈哈混喝了,会中毒吗?
83
吃过一些消炎药,3月份流过一次产月经推迟原因
84
阴道分泌物检查临床结果
85
别的症状没有。
86
今天早上刚起来全身疼痛
87
腰椎间盘突出牵引后左腿疼痛
88
我带上美瞳之后眼睛疼,摘下后眼睛干涩,不
89
一年没长了。
90
成人上吐下泻吃什么好?
91
风湿引起的腿疼怎么办
92
阴茎短小,请问有没有方法增大
93
脚趾骨折,多长时间能拆……
94
皮肤上长疱疹,该用什么抗病毒药治疗
95
包皮过长会影响性快感吗?
96
哪个对胎儿出生后皮肤白更有效
97
肾虚吃药能喝荷叶茶吗
98
我需要做宫颈癌筛查嘛
99
后边头发有一整圈没有是缺钙么
100
我也是手脚冰凉,吃啥中成药