15. .NET与设计模式

在大型软件架构中,设计模式可谓无处不在;在.NET Framework架构中,设计模式同样广泛应用在各个部分的设计之中。那么,什么是设计模式呢?

设计模式 是一系列的解决方案,它们被用于特定的环境来解决特定的问题。从代码的角度上讲,设计模式是组织代码功能与架构的一系列方法,但设计模式不是代码库,只是组织代码的方法;通过使用这些方法组织项目中的代码,可以高效、灵活地构建代码库,让我们可以快速应对项目中不断的需求变化。如果要达到这样结果,还需要注意一点,就是设计模式必须被正确地使用,或者干脆不用。

更重要的是,设计模式并不是被发明出来,而是在漫长的开发经验积累的过程中使用和发现;也就是说,设计模式是被发现并总结出来,而不是凭空想像出来的。

本章,我们将了解一些设计模式,并打开MSDN Library找寻它们的实际应用,包括以下内容:

l         适配器模式(Adapter Pattern)

l         模板方法模式(Template Method Pattern)

 

 

适配器模式

适配器(Adapter),在现实生活中无处不在,比如电源适配器,我们用它来连接插座和各式各样的电器、电子设备。在.NET Framework类库中,我们毫不费力就可以找到它们,比如,SqlDataAdapter、OleDbDataAdapter、OracleDataAdapter等。

如果打开MSDN Library查看它们的说明,我们会发现,它们的功能几乎是一样的,即连接数据源、填充DataSet对象中的数据等。那么这些xxxDataAdapter类充当的是什么角色呢?我们看看下面的图:

 

在.NET Framework架构中,DataSet是一个脱机数据集对象,即在它操作数据时并不需要实时连接数据库;在DataSet中,我们可以对不同的数据源(如Access、SQL Server、Oracle数据库等)进行统一的操作,实现这一功能,就必须通过一些组件在不同的数据库与DataSet对象之间进行数据格式转换和交流,将不同类型数据库的数据格式转换为DataSet中使用的数据组织格式,这就是那些xxxDataAdapter组件的功能。这种组织代码的方法就是应用了设计模式中的适配器模式(Adapter Pattern)

现在来看一下适配器模式的定义,创建一个适配器组件作为中间人,它将提供接口的转换功能,使两个不相关或不兼容的组件可以一起工作。

 

请注意接口的概念,有时我们是指VB.NET中使用Interface语句定义的接口类型;有时只是一个抽象的概念,表示两个组件之间的某种关系,读者应该结合上下文明白应该是哪个意思。

在一系列的xxxDataAdapter对象中,最重要,也是最关键的部分就是Fill()方法,此方法用于将xxxDataAdapter对象中读取的各种类型的源数据填充到DataSet对象中,也就是完成了数据库与DataSet对象之间的对接(适配)工作。

 

 模板方法模式

不得不承认,在处理不同数据库时,有很多方法是一致的,这也导致了在.NET Framework架构中和其它软件架构一样,在数据库操作的类库中大量地使用了设计模式;这对于程序员来讲当然不是坏事,用相同的方法去使用不同的数据库可以减少学习的成本;比如,在各种DbCommand子类中的执行SQL的方式,常用的有如下三种:

l         ExecuteNonQuery()方法,用于执行SQL语句,并返回最后一条语句执行所影响的记录数。

l         ExecuteReader()方法,通过执行SQL语句,返回一个xxxDataReader对象(一种动态连接数据对象,它只能向前顺序读取数据记录)。

l         ExecuteScalar()方法,返回查询结果的第一条记录中第一个字段的值,如果没有则返回NULL值,在VB.NET中使用vbDbNull常量表示。

 

在SqlCommand、OleDbCommand和OracleCommand等类中,我们都可以发现这三种方法,这些类都继承于DbCommand类(System.Data.Common命名空间),而DbCommand类则是实现了IDbCommand接口(System.Data命名空间)。这种代码的组织方法就使用了设计模式中的模板方法模式(Template Method Pattern)。我们对模板方式模式的定义如下:

定义一系列的算法结构,并延续到其子类中,子类在不改变算法结构的同时,可以定义自己的具体实现。

 

这就意味着,在使用模板方法模式时,在子类中只是需要实现基类中已经定义好的算法结构,在此基础上,子类可以各自实现这些算法,并可以扩展一些自己的类所需要的方法。比如在SqlCommand类中就定义了一系列用于异步执行SQL语句的方法,如BeginExecuteNonQuery()和EndExecuteNonQuery()方法、BeginExecuteReader()和EndExecuteReader()方法等。

 

使用模板方法模式 的要点还在于,接口和基类一般只是起一个定义算法结构的作用,而基类必须被继承;比如,DbCommand类就被定义为MustInherit,它必须被子类继承,也就是说我们不能创建DbCommand类的实例。下图给出了上述一系列的接口和类的关系:

 

 

小结

本章,我们大概了解了什么是设计模式,并在.NET Framework架构中找到一些设计模式的应用。

从我们找到的适配器与模板方法两种设计模式在.NET Framework类库中的应用中,我们可以发现,设计模式只是代码结构的组织方法,而不是代码本身,这一点非常重要。

对于何时使用设计模式,我们说,只在你认为真正需要它们的时候;如果连写个“Hello World”的示例,你都在思考设计模式的应用,那就真的有点过了。还是在本章开始的那句话,那就是设计模式必须被正确地使用,或者干脆不用。

从下一章开始,我们将开始介绍一些设计模式,并在我们的代码使用这些模式。对于四人组总结的经典的23个设计模式名录,请参考附录六。在一些专业软件的领域里,还会有更多的业务流程类的不同专业领域的设计模式,本书将不涉及这些内容。

 

出自:http://www.caohuayu.com/books/B0003/B0003.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值