【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方法即可。