技术开发 频道

.Net设计模式之外观模式

【IT168技术文档】

  概述
 
  1.1意图
 
  外观模式定义了一个将子系统的一组接口集成在一起的高层接口,以提供一个一致的界面。通过这个界面,其他系统可以方便地调用子系统中的功能,而忽略子系统内部发生的变化。
 
  1.2使用场合
 
  在如下情况下可以使用外观模式。
 
  (1)为一个比较复杂的子系统提供一个简单的接口。
  (2)将客户程序与子系统的实现部分分离,提高子系统的独立性和可移植性。
  (3)简化子系统间的依赖关系。
 
  1.3 结构
 
  由于该模式的引入,所以外界访问通过这个统一接口进行,系统的复杂性得到降低。在实际中,我们不仅可以从软件逻辑上划分出子系统或者独立的功能模块,并且可以通过将它们封装为某一类型的组件,使其在物理上获得独立。不仅可以单独使用,还有利于系统的升级。
 
  在Windows系统下,可以将一个软件划分后的部分封装为动态接库。然后由主程序调用这些动态接库,封装在动态库中的类(或功能模块)通过外观模式接口与外界发生联系。
 
  1.4效果
 
  外观模式为用户提供了使用子系统组件的简化的接口,使用户减少了处理对象的数目,并且使子系统使用简单。
 
  使用外观模式使子系统和客户之间实现松耦合关系,由于客户针对其接口编程,因此子系统的变化不会影响客户的变化,即其有助于分层体系结构的实现。
 
  外观模式并没有限制客户使用子系统类,仍可以直接使用子系统中的类。
 
  数据库访问外观模式

  在前面已经介绍了有关数据库访问的内容,只是角度不同,其中的部分代码如下。

Public MustInherit Class clsAbstractDBClass clsAbstractDB Protected mConnString As String Public Property ConnString()Property ConnString() As String Get Return mConnString  End Get  Set(ByVal Value As String) mConnString = Value  End Set End Property Public Sub New()Sub New(ByVal cs As String)  mConnString = cs End Sub Public MustOverride Sub Open()Sub Open() Public MustOverride Sub close()Sub close() Public MustOverride Function ExecSQL() Function ExecSQL(ByVal strSQL As String) As DataTable Public MustOverride Sub ExecSQLNonQuery() Sub ExecSQLNonQuery(ByVal strSQL As String) Public MustOverride Function TrateDateField()Function TrateDateField(ByVal strDateValue As String) As String End Class
  ClsAbstractDB定义了外观模式的接口,在针对具体数据库中实现了对Connection、Command和DataAdpter的封装。
 
  以ClsAbstractDB为例,代码如下:
Public Class clsSQLServerDBClass clsSQLServerDB Inherits clsAbstractDB Private mConn As Data.SqlClient.SqlConnection Public Sub New()Sub New(ByVal cs As String) MyBase.New(cs)  mConn = New Data.SqlClient.SqlConnection End Sub Public Overrides Sub close()Sub close()  If mConn.State <> ConnectionState.Closed Then mConn.Close()  End If End Sub Public Overrides Function ExecSQL()Function ExecSQL (ByVal strSQL As String) As System.Data.DataTable  Dim dt As DataTable  Dim dbComm As New Data.SqlClient.SqlCommand(strSQL)  Dim dbApt As New Data.SqlClient.SqlDataAdapter(dbComm)  dbComm.Connection = mConn  dbApt.Fill(dt)  Return dt End Function Public Overrides Sub ExecSQLNonQuery()Sub ExecSQLNonQuery(ByVal strSQL As String) Dim dbComm As New Data.SqlClient.SqlCommand(strSQL) dbComm.Connection = mConn dbComm.ExecuteNonQuery() End Sub Public Overrides Sub Open()Sub Open() If mConn.State = ConnectionState.Closed Then mConn.ConnectionString = mConnString mConn.Open() End If End Sub Public Overrides Function TrateDateField()Function TrateDateField(ByVal strDateValue As String) As String  Return "#" & strDateValue & "#" End Function Protected Overrides Sub Finalize()Sub Finalize() MyBase.Finalize() mConn = Nothing End Sub End Class
  这样,当客户端软件需要执行SQL语句时,只要调用ExecSQL方法即可。

0
相关文章