摘要:外觀模式是一種使用普遍的設計模式。利用它設計的中間件,擁有使用方便,理解容易等特點。文章利用外觀模式對系統中的數據庫訪問層進行設計,并利用C#語言實現其功能。
關鍵詞:設計模式;外觀模式;數據庫訪問層
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)23-849-03
Design and Realization of Database Access Layer Based on Facade Pattern
LI Dan
(School of Software, HuaZhong University of Science and Technology, Wuhan 430000, China)
Abstract: The Facade Pattern, a kind of Design Patterns, is widely used. The Midware designed with the Facade Pattern is easy to understand and be used. We design the Database Access Layer with the Facade Pattern and try to realize it with C#.
Key words: Design Pattern; Facade Pattern; Database Access Layer
1 引言
Christopher Alexander說過:“每一個模式描述了一個在我們周圍不斷重復發生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復勞動” [1]。設計模式使人們可以更加簡單方便地復用成功的設計和體系結構。它可以幫助你做出有利于系統復用的選擇,同時提高系統的可維護性[2]。
2 設計模式介紹
隨著設計模式越來越流行,這個領域的研究和文獻越來越多起來,出現了一些比較權威的設計模式研究成果和文獻。在The Smalltalk Companion這本設計模式的權威書籍中給出了設計模式的一個定義:“設計模式是對讀者經常遇到的設計問題的再現方案” [1]。一般而言,一個模式由四個基本要素構成。
1)模式名稱(pattern name):一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。命名一個新的模式增加了我們的設計詞匯,設計模式允許我們在較高的抽象層次上進行設計,基于一個模式詞匯表,我們自己以及同事之間就可以討論模式并在編寫文檔時使用它們,模式名可以幫助我們思考,便于我們與其他人交流設計思想及設計結果,找到恰當的模式名也是我們設計模式編目工作的難點之一。
2)問題(problem):描述了應該在何時使用模式,它解釋了設計問題和問題存在的前因后果,它可能描述了特定的設計問題,如怎樣用對象表示算法等。也可能描述了導致不靈活設計的類或對象結構。有時候,問題部分會包括使用模式必須滿足的一系列先決條件。
3)解決方案(solution):描述了設計的組成成分,它們之間的相互關系及各自的職責和協作方式,因為模式就像一個模板,可應用于多種不同場合,所以解決方案并不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合(類或對象組合)來解決這個問題。
4)效果(consequences):描述了模式應用的效果及使用模式應權衡的問題。盡管我們描述設計決策時,并不總提到模式效果,但它們對于評價設計選擇和理解使用模式的代價及好處具有重要意義。軟件效果大多關注對時間和空間的衡量,它們也表述了語言和實現問題,因為復用是面向對象設計的要素之一,所以模式效果包括它對系統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。
3 外觀模式介紹
Facade是主要的設計模式之一,得到廣泛的應用。Facade為子系統中的一組方法提供一個一致的界面,這個界面就是“外觀”,這個被稱為“外觀”的接口使得這一子系統更加容易被使用和理解(圖1)。
3.1 外觀模式意圖
外觀模式定義了一個將子系統的一組接口集成在一起的高層接口,以提供一個一致的界面。通過這個界面,其他系統可以方便地調用子系統中的功能,而忽略子系統內部發生的變化。
3.2外觀模式使用場合
1)增強分層結構的邏輯性:在實現分層設計時,我們可以采用外觀模式封裝層次,從而可以清楚地劃分層次界面的歸屬。然后我們約定,必須通過外觀接口來訪問內部方法或對象的實例,這樣就保持了很清晰的層次結構。
2) 封裝現有系統:在做二次開發的時候,這時需要封裝現有的老系統,使之對外可用。這樣,我們的開發人員可以在不影響原先系統的功能的情況下開發新的系統,并且可以通過老系統的“外觀”接口使用其方法。
3)編寫可復用的中間件:作為一個可能被經常使用的模塊,可以把它設計成外觀模式,這樣在下一個相近的項目中,我們可以復用它。得益于外觀模式,這個模塊具有使用簡單,易于理解的特點。
4 基于外觀模式的數據庫訪問層
開發數據庫應用程序時,不免涉及到數據庫訪問層的設計。一個良好的數據庫訪問層應該有如下特點:1)易用性,控制層的開發人員只需掌握羅干方法或函數。2)可移植性,對于不同的數據庫平臺應該都可以適用。3)可理解性,邏輯清晰,便于閱讀和修改。而外觀模式恰恰具有以上特點[3]。
4.1 數據庫訪問層的設計
采用外觀模式設計數據庫訪問層,得到數據庫訪問層的類結構圖(圖2)。DbaseLayer是一個接口類,它就是文中提到的那個“外觀”,利用它封裝了下面比較復雜的數據訪問層的實現。AccessDataBaseLayer、SQLServerDataBaseLayer、OracleDataBaseLayer、DB2DataBaseLayer分別采用不同的數據庫連接字串與不同數據庫鏈接,而這些具體的實現controlLayer是不用知道的,它建立DbaseLayer的實例以后就只需通過SqlExecute方法得到數據集合了。
4.2 數據庫訪問層的實現
C#是一種強大的高級編程語言,由于它具有DataSet等數據庫工具類,編寫數據庫訪問層比較方便,效率較高。所以本文利用C#實現此數據庫訪問層,以下是部分代碼,包括外觀基類和ACCESS,ORACLE數據庫的連接類。
public abstract class DBaseLayer {//外觀基類
protected OleDbConnection conn;
private void openConnSelf()//打開連接
{if (conn.State == ConnectionState.Closed)
conn.Open ();}
private void closeConnSelf() //關閉連接
{if (conn.State == ConnectionState.Open )
conn.Close ();}
public DataTable SqlExecute(string sqlString)//執行sql查詢得到數據dataTeble
{ OleDbDataAdapter oleAdapter = new OleDbDataAdapter ();
DataSet dataSet = new DataSet ();
DataTable dataTable = 1;
try {
oleAdapter.SelectCommand = new OleDbCommand(sqlString, conn);
openConnSelf();
oleAdapter.Fill(dataSet, \"tempdata\");
dataTable = dataSet.Tables[0];
closeConnSelf();
return dataTable;}
catch (Exception ex) {
return 1;
}}
public void openConn(string connString) { //打開連接公共方法
conn = new OleDbConnection(connString);}}
public class AccessDatabaseLayer :DBaseLayer//ACCESS數據庫訪問實現
{public AccessDatabaseLayer(string dataBaseName,string passWord,string useId)
{ string connString = \"Provider=Microsoft.Jet.OLEDB.4.0;Password=\"+passWord
+\"; User ID=\"+useId+\";Data Source=\"+dataBaseName;
openConn(connString);}}
public class OracleDatabaseLayer:DBaseLayer//ORACLE數據庫訪問實現
{string connString;//
public OracleDatabaseLayer(string dataSource) {
connString = \"Provider=MSDAORA; Data Source=\"+dataSource
+\";Persist Security Info=False;Integrated Security=yes\";
openConn (connString);}}
4 結語
在開發數據庫訪問層時,使用外觀模式,使得系統能夠適用于不同種類的數據庫,并且由于控制層不需要了解其實現細節,使用起來方便簡單,從而增強了系統的復用性和可移植性。
參考文獻:
[1] Gamma E, Richard H, Johnson R. Design Patterns: Elements of Reusable Object-Oriented[M].Addison-Wesley,1995.
[2] 縐娟,田玉敏.軟件設計模式的選擇與實現[J].計算機工程,2004,30(10):79-81.
[3] 陳小平,宋健康,歐建雄.多層J2EE架構下的會話Facade模式[J].微型電腦應用,2002,18(12):28-30.