就他吧-9ta8为您提供:身份证查询、15位转16位身份证,手机号码归属地查询,IP地址查询服务,城市天气预报查询,列车时刻表简易快速查询等等查询服务,就他吧欢迎您的光临!!
梦幻Dot Net
科学地研究编程,品味开发的艺术
博客园
首页
新随笔
联系
订阅
管理
随笔-93 评论-627 文章-7 trackbacks-76
Dot Net设计模式—外观模式
1.概述
1.1意图
外观模式定义了一个将子系统的一组接口集成在一起的高层接口,以提供一个一致的界面。通过这个界面,其他系统可以方便地调用子系统中的功能,而忽略子系统内部发生的变化。
1.2使用场合
在如下情况下可以使用外观模式。
(1)为一个比较复杂的子系统提供一个简单的接口。
(2)将客户程序与子系统的实现部分分离,提高子系统的独立性和可移植性。
(3)简化子系统间的依赖关系。
1.3 结构
下图所示为外观模式的结构。由于该模式的引入,所以外界访问通过这个统一接口进行,系统的复杂性得到降低。
在实际中,我们不仅可以从软件逻辑上划分出子系统或者独立的功能模块,并且可以通过将它们封装为某一类型的组件,使其在物理上获得独立。不仅可以单独使用,还有利于系统的升级。
在Windows系统下,可以将一个软件划分后的部分封装为动态接库。然后由主程序调用这些动态接库,封装在动态库中的类(或功能模块)通过外观模式接口与外界发生联系。
1.4效果
外观模式为用户提供了使用子系统组件的简化的接口,使用户减少了处理对象的数目,并且使子系统使用简单。
使用外观模式使子系统和客户之间实现松耦合关系,由于客户针对其接口编程,因此子系统的变化不会影响客户的变化,即其有助于分层体系结构的实现。
外观模式并没有限制客户使用子系统类,仍可以直接使用子系统中的类。
2. 数据库访问外观模式
在前面已经介绍了有关数据库访问的内容,只是角度不同,其中的部分代码如下。
1
Public
MustInherit
Class clsAbstractDB
Class
clsAbstractDB
2
Protected
mConnString
As
String
3
Public
Property ConnString()
Property
ConnString()
As
String
4
Get
5
Return
mConnString
6
End
Get
7
Set
(
ByVal
Value
As
String
)
8
mConnString
=
Value
9
End
Set
10
End Property
11
12
Public
Sub New()
Sub
New
(
ByVal
cs
As
String
)
13
mConnString
=
cs
14
End Sub
15
16
Public
MustOverride
Sub Open()
Sub
Open()
17
Public
MustOverride
Sub close()
Sub
close()
18
Public
MustOverride
Function ExecSQL()
Function
ExecSQL(
ByVal
strSQL
As
String
)
As
DataTable
19
Public
MustOverride
Sub ExecSQLNonQuery()
Sub
ExecSQLNonQuery(
ByVal
strSQL
As
String
)
20
Public
MustOverride
Function TrateDateField()
Function
TrateDateField(
ByVal
strDateValue
As
String
)
As
String
21
End Class
22
ClsAbstractDB定义了外观模式的接口,在针对具体数据库中实现了对Connection、Command和DataAdpter的封装。
以ClsAbstractDB为例,代码如下:
1
Public
Class clsSQLServerDB
Class
clsSQLServerDB
2
Inherits
clsAbstractDB
3
Private
mConn
As
Data.SqlClient.SqlConnection
4
Public
Sub New()
Sub
New
(
ByVal
cs
As
String
)
5
MyBase
.
New
(cs)
6
mConn
=
New
Data.SqlClient.SqlConnection
7
End Sub
8
Public
Overrides
Sub close()
Sub
close()
9
If
mConn.State
<>
ConnectionState.Closed
Then
10
mConn.Close()
11
End
If
12
End Sub
13
14
Public
Overrides
Function ExecSQL()
Function
ExecSQL(
ByVal
strSQL
As
String
)
As
System.Data.DataTable
15
Dim
dt
As
DataTable
16
Dim
dbComm
As
New
Data.SqlClient.SqlCommand(strSQL)
17
Dim
dbApt
As
New
Data.SqlClient.SqlDataAdapter(dbComm)
18
dbComm.Connection
=
mConn
19
dbApt.Fill(dt)
20
Return
dt
21
End Function
22
23
Public
Overrides
Sub ExecSQLNonQuery()
Sub
ExecSQLNonQuery(
ByVal
strSQL
As
String
)
24
Dim
dbComm
As
New
Data.SqlClient.SqlCommand(strSQL)
25
dbComm.Connection
=
mConn
26
dbComm.ExecuteNonQuery()
27
End Sub
28
29
Public
Overrides
Sub Open()
Sub
Open()
30
If
mConn.State
=
ConnectionState.Closed
Then
31
mConn.ConnectionString
=
mConnString
32
mConn.Open()
33
End
If
34
End Sub
35
36
Public
Overrides
Function TrateDateField()
Function
TrateDateField(
ByVal
strDateValue
As
String
)
As
String
37
Return
"
#
"
&
strDateValue
&
"
#"
38
End Function
39
40
Protected
Overrides
Sub Finalize()
Sub
Finalize()
41
MyBase
.Finalize()
42
mConn
=
Nothing
43
End Sub
44
End Class
45
这样,当客户端软件需要执行SQL语句时,只要调用ExecSQL方法即可。
3.分层结构与外观模式
分层体系结构是一个时髦的话题,理论上讲,分层结构可以使系统更为清晰,更具可维护性。然而,在实践中,如果层次划分不合理,就会产生数据和功能的冗余。
需要注意的是分层的原则,即业务类负责的是业务处理,还是数据缓存。必须说明的是,层次的划分按照功能进行,而数据是在层次之间的传递。
在实现分层设计时,我们不希望层次之间有跨越;否则分层实际上没有太多意义。然而,层次之间的界面经常很难划分清楚,可以采用外观模式封装层次。在设计时可以规定,对英雄模范一层次的访问必须经过外观对象。即确保外观是层次对外的惟一接口,编程从员面对的只是其他层次的外观。这样,就保证了层次仅与相临的部分交互。
4.封装子系统
系统升级时,经常是一个大系统的若干子系统分别升级。这时需要封装遗留的子系统,以对外提供一个简单的接口。这种封装可以减少子系统的变化对与它接口的系统的影响,只要接口不发生变化,子系统即可作为孤立的模块升级。
在系统升级过程中,我们不主张将所有的代码升级为新的版本,如从VB 6升级到VB.NET。因为升级过程会遇到各种不确定性,这种不确定性增加了系统实施的风险,在升级体系结构,要达到这个目的,首先要封装子系统。如升级VB 6,可以将可隔离的代码封装为DLL,以被VB.NET引用。完成体系结构升级后,再逐一更新。为了降低新系统和遗留系统的耦合性,可以采用外观模式,封装接口部分的功能,仅能够通过这个接口访问遗留系统。这时,外观模式的实现可以用下图表示。
可以看出,这种结构与适配器模式有些类似,并且目的也一致,不同的是这里针对的目标系统粒度要大得多。
5.子系统隔离
升级与整合一个包含多个子系统的信息系统时,需要隔离这些子系统,以降低耦合性。隔离后,每个部分可以实现单独的渐进演化,整个系统的实施可以采用并行方式进行。由于各子系统只是针对外观模式界面操作,所以各个子系统的不同版本可以同时协同工作,这样便于系统的动态实施。
外观模式对于子系统间耦合强的系统尤其有用,这一点对解决实际系统的同步实施很有帮助。在实际系统的实施中,往往由于各单位无法统一安排实施时间而被一拖再拖。
6.系统演化
当渐进演化原有系统时,可以采用外观模式封装原系统。首先开发新系统的表示层,业务逻辑采用原有系统。然后逐步修改各个功能模块,并替换原有系统,如下图:
posted on 2005-08-18 15:16
振河
阅读(1602)
评论(1)
编辑
收藏
所属分类:
.Net设计模式
评论:
#1楼
2005-08-20 15:38 |
flyarror [未注册用户]
画的最后这个图不错,呵呵
回复
引用
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2005-08-24 08:57 编辑过
相关文章:
.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伴您开心每一天