就他吧-9ta8为您提供:身份证查询、15位转16位身份证,手机号码归属地查询,IP地址查询服务,城市天气预报查询,列车时刻表简易快速查询等等查询服务,就他吧欢迎您的光临!!
梦幻Dot Net
科学地研究编程,品味开发的艺术
博客园
首页
新随笔
联系
订阅
管理
随笔-93 评论-627 文章-7 trackbacks-76
Dot Net设计模式—桥接模式
1.概述
1.1意图
“将抽象部分与它的实现部分分离,使它们都可以独立地变化”,这是GOF在《设计模式》一书中的解释。这里的抽象和实现并不一定是同一层次的概念,例如数据库操作可以归结为“增加、删除和修改”。很多业务过程都是通过对数据库的操作实现的,例如“库存管理”中的“入库”,这个业务动作的软件实现可以描述为“在库存表中增加一条记录”,而“入库”和“插入记录”处于不同的业务层次。
1.2使用场合
在如下情况下可以使用桥接模式。
(1)不希望在业务和业务的软件实现之间存在因定的绑定关系。例如,不希望“入库”业务过程和具体的数据库访问技术或数据库管理系统有过于密切的关系。最好是数据库访问技术的升级,或数据库管理系统的改变对业务模块没有影响,甚至在运行期间可以通过动态绑定来选择不同数据库技术或数据库管理系统。
(2)希望类的抽象和实现部分可以扩充,进而实现不同的抽象接口和实现部分的组合。
(3)修改实现部分对用户不产生影响,即代码无须重新编译。
(4)复用实现部分。由于实现部分所处的层次较低,因此可以被多种业务模块复用。例如,数据库访问模块可以用在多种业务单元中。
1.3结构
桥接模式的结构如图所示。
(1)Abstraction:定义抽象类的接口并维护指向Implementor类的对象指针。
(2)RefinedAbstraction:扩充Abstraction定义的接口。
(3)Implementor:定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。
事实上这两个接口可以完全不同。一般而言,Implementor接口仅提供基本操作,而Abstraction则定义了基于操作的较高层次的操作。
(4) ConcreteImplementor:实现Implementor接口并定义它的具体实现。
为了更深入了解这个模式,我们来看一个具体的例子。在应用系统中经常有很多业务单元在很多业务模块中类似,隐含在背后的业务域模型相同。例如,“设备管理”中的“零部件管理”,“物资管理”中的“库房管理”,“实验室管理”中的“试剂管理”等都是“库存管理”。但由于业务场景的不同,导致业务中的细节不同,因此不能简单地复用。另外,“库存管理”软件的实现主要通过操作关系数据库来完成,我们希望保持软件系统与数据库访问技术以及数据库管理系统的独立性。
为了实现以上要求,我们可以以桥接模式。即将抽象的“库存管理”和“数据库”操作作为具体的“库存管理”应用和具体的“数据库访问技术”的桥梁, 如下图所示。
从图中可以看出,我们将库存管理的抽象业务域模型封装在“抽象的库存管理”中。具体的库存管理业务如“生产车间库存管理”可以通过继承库存管理获得一般性的业务过程,然后根据具体的业务特点进行相应的扩展。
我们将数据库操作封装在dbOperation类中,具体执行访问数据库的各个指令,针对具体数据库的操作由该类的子类实现。
1.4效果
采用桥接模式可以获得以下好处。
(1)将接口与实现分离:一个接口可以有若干实现,一个实现也可以为若干对象服务,表示逻辑的对象可以动态地与实现功能的对象组合。
(2)提高可扩充性:逻辑和实现都可以通过类层次的扩展进行扩充。
需要注意的是,逻辑和实现被封装在不同的对象中,逻辑对实现的引用是动态进行的。在实际中,需要分别用不同的工厂创建逻辑和实现,然后组装。
2.多种数据源与多种数据显示方式的组合
桥接模式同样可用在多种数据采集方式的场合,在有生产过程实时数据采集时,经常遇到多种数据采集的接口。为适应这种情况,可以采用桥接模式,其结构如图所示。
针对不同的数据源有不同的数据采集方式,有的采集系统需要直接从文件中读取数据,有的需要从远程Web服务器读取数据,有的需要从实时数据库读取数据,有的需要从关系数据库读取数据等。数据采集系统是低层平台,在上层应用中需要各种方式的显示形式,例如流程图、表格、曲线图和趋势图等。每种显示方式模块都可能从不同的数据源接收数据,即不同类型的数据源和数据显示方式应该可以任意组合。
以一个来源于实际项目的例子说明。我们需要在Web页面上显示流程图,并且需要生成XML格式的流程图文件。其中采用简单工厂获得数据来源,数据来源标志保存在Web.config文件中。
下图所示为应用的局部结构,其中采用了桥接模式。
下面是部分代码,限于篇幅,仅列出结构部分。
定义clsAbstractReadData类,其中定义了需要获得数据的结构:
1
Imports
System.IO
2
Imports
System.Net
3
Imports
System.Text
4
Public
MustInherit
Class clsAbstractReadData
Class
clsAbstractReadData
5
Public
MustOverride
Function ReadData()
Function
ReadData(
ByVal
strDate
As
strDate
As
DataSet
6
Protected
mySourceDs
As
DataSet
7
Public
Sub New()
Sub
New
( )
8
MySourceDS
=
New
DataSet
9
Dim
dt
As
DataTable
10
‘这里定义数据结构,省略
11
End Sub
12
End Class
13
具体的读取类实现ReadData方法。下面是从文本文件中读取数据,其中给出了读取用逗号分隔数据的方法:
1
Public
Class clsReadDataFromFile
Class
clsReadDataFromFile
2
Inherits
ClsAbstractReadData
3
Private
datafilepath
As
String
4
5
Public
Sub New()
Sub
New
(
ByVal
strpath
As
String
)
6
MyBase
.
New
( )
7
Datafilepath
=
strpath
8
End Sub
9
Public
Overrides
Function ReadData()
Function
ReadData(
ByVal
strDate
As
String
)
As
10
System.
Date
.DataSet
11
‘调用ReadDataFromFile从具体的文件中读取数据,省略
12
Return
mysourceds
13
End Function
14
Private
Sub ReadDataFromFile()
Sub
ReadDataFromFile(
ByVal
fn
As
String
,,
ByVal
dt
As
DataTable,
ByVal
15
cn
As
Integer
)
16
‘fn 数据文件名
17
‘dt DtatTable
18
‘cn 字段数
19
Dim
fileNumber
As
Integer
20
FileNumber
=
FreeFile
( )
21
FileOpen
(fileNumber, fn, OpenMode.
Input
)
22
Dim
NextLine
As
String
23
I
=
1
24
Do
Until
EOF
(fileNumber)
25
NextLine
=
LineInput
(fileNumber)
26
If
I
>
1
And
Trim
(NextLine)
<>
“ ”
Then
27
Dim
j
As
Integer
28
Dim
r
As
DataRow
=
dt.NewRow
29
Dim
s
As
String
=
“ ,”
30
Dim
sp
As
Char
( )
=
s.ToCharArray
31
Dim
rs
As
String
( )
=
NextLine.
Split
(sp)
32
For
j
=
0
To
cn –
1
33
Dim
v
As
String
34
Try
35
V
=
rs ( j )
36
r.Item( j )
=
Trim
( v )
37
Catch
ex
As
Exception
38
r.Item( j )
=
“ ”
39
End
Try
40
Next
41
Dt.Rows.Add(r)
42
End
If
43
I
=
I
+
1
44
Loop
45
FileClose
(fileNumber)
46
End Sub
47
Private
Function IsFileExist()
Function
IsFileExist (
ByVal
fn
As
String
)
As
Boolean
48
If
FileSystem.
Dir
(fn)
=
“ ”
Then
Return
False
49
Return
True
50
End Function
51
End Class
52
下面是产生读取对象的简单工厂:
1
Public
Class clsReaDataFactory
Class
clsReaDataFactory
2
Pbulic
Shared
Function getDataReader()
Function
getDataReader ( )
As
clsAbstractReadData
3
Dim
datafilepath
As
String
=
4
ConfigurationSettings.AppSettings (“DataFilePath”)
5
Dim
strDataType
As
String
=
ConfigurationSettings.AppSettings (“DataType”)
6
Dim
strHttp
As
String
=
ConfigurationSettings.AppSettings (“DataURL”)
7
Select
Case
strDataType
8
Case
“http”
9
Dim
mrd
As
clsReadDataFromRemoteFile
10
Mrd
=
New
clsReadDataFromRemoteFile (strHttp)
11
Return
mrd
12
Case
Else
13
Dim
mrd
As
clsReadDataFromFile
14
Mrd
=
New
clsReadDataFromFile(datafilepath)
15
Return
mrd
16
End
Select
17
End Function
18
end class
posted on 2005-08-17 09:02
振河
阅读(1500)
评论(0)
编辑
收藏
所属分类:
.Net设计模式
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2005-08-24 08:58 编辑过
相关文章:
.NET设计模式系列文章
使用Visual Studio2005入门.Net2.0系列视频教程
.NET设计模式(2):单件模式(Singleton Pattern)
.NET设计模式(3):抽象工厂模式(Abstract Factory)
Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇
C#设计模式(1)
相关链接:
所属分类的其他文章:
Dot Net设计模式—MVC模式
用实例解说Dot Net设计模式——装饰模式
创建型模式之间的比较
.NET反射、委托技术与设计模式
Dot Net设计模式—适配器、桥接与外观三模式之间的关系
Dot Net设计模式—外观模式
如何在实际工作中发现模式(二)
如何在实际工作中发现模式(一)
Dot Net设计模式—桥接模式
Dot Net设计模式—适配器模式
最新IT新闻:
Google拟在9月发布自有浏览器 或采用火狐内核
微软正在构思将Wi-Fi带入汽车
对比测试:IE8 Beta 2 VS Firefox 3.0.1
iPhone存在严重密码安全漏洞
GC2008:星际争霸2进程报告 微调进程延续
博客园新闻频道
博客园首页
社区
清新的空气清晰的你愉快的心情陪伴你,欢迎来到梦幻Dot Net。
<
2005年8月
>
日
一
二
三
四
五
六
31
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
1
2
3
4
5
6
7
8
9
10
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(24)
给我留言
查看留言
我参与的团队
Design & Pattern团队(3/848)
.NET 控件与组件开发(0/1361)
敏捷软件开发组织(0/278)
北京.NET俱乐部(2/1463)
Dot Net Web服务和Windows服务开发(0/231)
正则表达式团队(0/2)
随笔分类
.Net设计模式(21)
ASP.Net(9)
C#(12)
C#2005(2)
DotText
JavaScript(8)
Reporting Services(6)
SD Channel
SQL Server 2000(10)
Visio Studio 2005 WPF(2)
Web and Windows Service(5)
其他(7)
软件工程(7)
正则表达式(2)
随笔档案
2008年3月 (1)
2008年1月 (2)
2007年12月 (1)
2007年11月 (1)
2007年10月 (4)
2007年8月 (1)
2007年7月 (1)
2007年5月 (1)
2007年4月 (1)
2007年3月 (1)
2007年1月 (2)
2006年12月 (1)
2006年10月 (1)
2006年9月 (2)
2006年8月 (1)
2006年7月 (1)
2006年4月 (1)
2006年3月 (4)
2006年2月 (1)
2006年1月 (1)
2005年12月 (1)
2005年11月 (1)
2005年10月 (5)
2005年9月 (11)
2005年8月 (36)
2005年7月 (10)
文章分类
ASP.NET(2)
安全与加密(1)
管理(1)
生活(1)
数据库(2)
文章档案
2007年12月 (1)
2005年10月 (1)
2005年9月 (1)
2005年8月 (4)
相册
宝贝动物
精彩贴图
生活餐具
.NET技术网站
ASP.NET开发实践系列课程
ASP酷技术网
CodeProject
KnowDotNet
Visual Studio.net专栏
博客堂
发赛特技术网
酷网博客
孟宪会.NET开发者园地
太平洋开发编程技术与实例
天新网DotNet
新一代技术网
站长中国
正则表达式
中国C#技术网站
中文C#站
其他技术网
ASP.NET Forums 官方中文网站
MSDN中文站
动态网站制作指南
正则表达式网站(Eng)
中国BS网
中国Office Online
中国WEB开发者网络
数据库技术网站
SQL Server 提示与技巧
数据仓库之路
友情连接
就他吧服务
就他吧为您提供软件开发,网站设计,网站开发维护,各种办公软件、管理软件开发等等,详情请进入
http://www.9ta8.com
幽默笑话
笑话大全、智慧快餐、暴笑网文、高笑图片、恐怖故事、幽默短信、相声小品尽在其中,就他吧幽默站开心您每一天
积分与排名
积分 - 249904
排名 - 122
最新评论
1. re: DotNet WebService和WindowsService团队开通
1.博客园帐户名:yjmyzz 2.电子邮件:yjmyzz@126.com 3.博客园地址: 4.申请目的:学习和探讨Web服务或者Windows服务的开发原理,技巧以及实践经验. ...
--yjmyzz
2. re: DotNet WebService和WindowsService团队开通
1.博客园帐户名:Clefoo 2.电子邮件:clefoo@126.com 3.博客园地址: 4.申请目的:学习和探讨Web服务或者Windows服务的 ...
--Clefoo的马甲
3. re: DotNet WebService和WindowsService团队开通
我非常希望加入 1.博客园帐户名:aierong 2.电子邮件:aierong@126.com 3.博客园地址: ...
--aierong
4. re: COM+组件与COM+服务使用的区别
你好,我想请教您两个问题,关于开发COM+方面的.可以加下我QQ吗,QQ:285625240
--wangjianguo
5. re: C#几种常用的排序算法
不错啊,呵呵,理解了,谢谢你啊
--顾客
阅读排行榜
1. 正则表达式基础知识(21433)
2. 全面剖析C#正则表达式(18159)
3. C#反射实例讲解(9929)
4. .NET反射、委托技术与设计模式(9842)
5. .Net调用Java的WebService之亲身体验(9293)
评论排行榜
1. DotNet WebService和WindowsService团队开通(124)
2. 如何掌握并在实践中自如运用设计模式(51)
3. C#写的一个代码生成器(35)
4. 用.Net开发Windows服务初探(27)
5. .NET反射、委托技术与设计模式(21)
就他吧-9ta8伴您开心每一天