B2) Bridge (橋模式) 定義: 把抽象從實(shí)現(xiàn)中分離出來,使得兩者可以獨(dú)立的變化。 字面上很難理解定義的意思,那從另外一個(gè)方面來講,一個(gè)對象可以看作是對象本身和對象行為的結(jié)合,那么對于一個(gè)抽象對象的具體實(shí)現(xiàn),就是對其自身和行為的實(shí)現(xiàn)。而將抽象與實(shí)現(xiàn)分離,也就是將自身與行為的分離。打個(gè)比方,人是個(gè)抽象的定義,那人有吃飯這個(gè)抽象的行為。對于人的一個(gè)實(shí)例中國人,吃飯時(shí)候用筷子,而印度人用手,美國人用刀叉。這樣就有了三個(gè)實(shí)現(xiàn),但中國人有時(shí)候吃飯也用刀叉,美國人也會(huì)用筷子,這時(shí)候如果按照原先的方法,又需要生成兩個(gè)新的實(shí)現(xiàn),如此就變得復(fù)雜而混亂。于是,橋模式就有了用武之地。把人本身與吃飯這個(gè)行為分離開來,人有不同的實(shí)現(xiàn),如中國人,美國人,而吃飯也有不同的實(shí)現(xiàn),如用筷子,用手。有點(diǎn)像以前考試?yán)锩娴倪B線題,左邊是某個(gè)歷史人物(對象),右邊是發(fā)生的歷史事件(行為),用直線連接,這條線就是一座橋,當(dāng)然可能一個(gè)人做過幾件事情。那就以人吃飯為例子,來看橋模式的實(shí)現(xiàn)方法。下面是人和吃飯的抽象類。 public abstract class Person { private PersonImp personImp; public Person(PersonImp pImp) { personImp = pImp; } public void eat() { personImp.eat(); } public String getCountry() { return "world"; } } public abstract class PresonImp { public abstract void eat(); } 接下來實(shí)現(xiàn)人吃飯的行為,筷子和刀叉 public class EatByCS extends PresonImp { public void eat() { // eat by chopsticks } } public class EatByKF extends PresonImp { public void eat() { // eat by knives and forks } } 那么,美國人和中國人的實(shí)現(xiàn)就是 public class American extends Person { public String getCountry() { return "America"; } } public class Chinese extends Person { public String getCountry() { return "China"; } } 美國人用筷子吃飯和中國人用刀叉就可以表示為 Person personA = new American(new EatByCS()); personA.eat(); Person personC = new Chinese(new EatByKF()); personC.eat(); 其他不同的對象與行為的組合也可以以此類推,人可以自由派生,吃飯的方法也可以隨意改變,兩者變化對對方毫無干擾,體現(xiàn)了橋模式的優(yōu)勢。非常有效的對已有對象的利用,結(jié)構(gòu)層次清晰且更加易于擴(kuò)展,這就是結(jié)構(gòu)模式的用途。
參考: 1、 http://www./designpatterns/bridge.htm(中文、java實(shí)例) 2、 http://www./Patterns/PatternBridge.aspx(英文、C#實(shí)例、UML) 3、 http://www./tech/DesignPattern/Bridge.html(日文、java實(shí)例、UML)推薦
|