Bridge模式是一個(gè)在實(shí)際系統(tǒng)中經(jīng)常應(yīng)用的模式。它最能體現(xiàn)設(shè)計(jì)模式的原則針對(duì)接口進(jìn)行編程,和使用聚合不使用繼續(xù)這兩個(gè)原則。
由于我們過(guò)分的使用繼續(xù),使類的結(jié)構(gòu)過(guò)于復(fù)雜,不易理解,難以維護(hù)。非凡是在java中由于不能同時(shí)繼續(xù)多個(gè)類,這樣就會(huì)造成多層繼續(xù),維護(hù)更難。
Bridge模式是解決多層繼續(xù)的根本原因。假如你在實(shí)現(xiàn)應(yīng)用中一個(gè)類,需要繼續(xù)兩個(gè)以上的類,并且這兩者之間又持有某種關(guān)系,它們兩個(gè)都會(huì)有多種變化。
Bridge模式是把這兩個(gè)類,分解為一個(gè)抽象,一個(gè)實(shí)現(xiàn),使它們兩個(gè)分離,這樣兩種類可以獨(dú)立的變化。
抽象就是,把一個(gè)實(shí)體的共同概念(相同的步驟),抽取出來(lái)(分解出幾個(gè)相互獨(dú)立的步驟),作為一個(gè)過(guò)程。如我們把數(shù)據(jù)庫(kù)的 操作抽象為一個(gè)過(guò)程,有幾個(gè)步驟,創(chuàng)建SQL語(yǔ)句,發(fā)送到數(shù)據(jù)庫(kù)處理,取得結(jié)果。
實(shí)現(xiàn)就是怎樣完成這個(gè)抽象步驟,如發(fā)送到數(shù)據(jù)庫(kù),需要結(jié)合具體的數(shù)據(jù)庫(kù),考慮怎樣完成這個(gè)步驟等。并且同一步驟可能存在不同的實(shí)現(xiàn),如對(duì)不同的數(shù)據(jù)庫(kù)需要不同的實(shí)現(xiàn)。
現(xiàn)在我們假設(shè)一個(gè)情況,也是WEB中經(jīng)常碰到的,在一個(gè)page有輸入框,如客戶信息的姓名,地址等,輸入信息后,然后按查找按鈕,把查找的結(jié)果顯示出來(lái)。
我們現(xiàn)在假設(shè)查找客戶信息和帳戶信息,它們?cè)诓煌谋碇小?br />
但是我們的系統(tǒng)面對(duì)兩種人群,總部的它們信息保存到Oracle數(shù)據(jù)庫(kù),但是各個(gè)分公司的數(shù)據(jù)保存在Sybase中,數(shù)據(jù)庫(kù)的位置等各不相同,這兩種的操作不同。
下面是我們一般首先會(huì)使用的方式,使用if else進(jìn)行,判定,這樣使用系統(tǒng)難以維護(hù),難以擴(kuò)展,不妨你增加一種查詢,或者一種數(shù)據(jù)庫(kù)試試?
public class SearchAction(){
public Vector searchData(string ActionType,String DBType){
String SQL="";
if(ActionType.equal("查找客戶信息")){
//假如是查詢客戶信息,拼SQL語(yǔ)句從客戶表中讀取數(shù)據(jù)
SQL="select * from Customer "
if(dbType.equal("oracle")){
//從總部數(shù)據(jù)庫(kù)讀取,數(shù)據(jù)庫(kù)為Oracle
String connect_string ="jdbc:oracle:thin:hr/hr@localhost:1521:HRDB";
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
Connection conn = DriverManager.getConnection (connect_string);
// Create a statement
Statement stmt = conn.createStatement ();
ResultSet rset = stmt.executeQuery (SQL);
//以下省略部分動(dòng)態(tài)從數(shù)據(jù)庫(kù)中取出數(shù)據(jù),組裝成Vector,返回
..................................
...................................
}else(dbType.equal("sybase")){
//從分公司數(shù)據(jù)庫(kù)讀取,數(shù)據(jù)庫(kù)為Sybase
String connect_string ="jdbc:sybase:Tds:cai/cai@192.168.1.12:1521:FIN";
DriverManager.registerDriver (new com.sybase.jdbc.SybDriver());
Connection conn = DriverManager.getConnection (connect_string);
// Create a statement
Statement stmt = conn.createStatement ();
ResultSet rset = stmt.executeQuery (SQL);
//以下省略部分動(dòng)態(tài)從數(shù)據(jù)庫(kù)中取出數(shù)據(jù),組裝成Vector,返回
..................................
...................................
}
}else if(ActionType.equal("查找?guī)粜畔?)){
//假如是查詢帳戶信息,拼接SQL語(yǔ)句從帳戶表中讀取數(shù)據(jù)
SQL="select * from Account "
if(dbType.equal("oracle")){
..........................
..........................
(作者注:此處省略從oracle讀取,約300字)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注