橋接模式 (Bridge)
??? 將抽象部分與實現部分分離,使它們都可以獨立的變化。
??? 在軟件系統中,某些類型由于自身的邏輯,它具有兩個或多個維度的變化,那么如何應對這種“多維度的變化”?如何利用面向對象的技術來使得該類型能夠輕松的沿著多個方向進行變化,而又不引入額外的復雜度?這就要使用Bridge模式。
??? 效果及實現要點:
??? (1) Bridge模式使用“對象間的組合關系”解耦了抽象和實現之間固有的綁定關系,使得抽象和實現可以沿著各自的維度來變化。
??? (2) Bridge模式的應用一般在“兩個非常強的變化維度”,有時候即使有兩個變化的維度,但是某個方向的變化維度并不劇烈——換言之兩個變化不會導致縱橫交錯的結果,并不一定要使用Bridge模式。
?
?
??? 拿汽車在路上行駛的來說。即有小汽車又有公共汽車,它們都不但能在市區中的公路上行駛,也能在高速公路上行駛。這你會發現,對于交通工具(汽車)有不同的類型,然而它們所行駛的環境(路)也在變化,在軟件系統中就要適應兩個方面的變化?怎樣實現才能應對這種變化呢?
// 抽象路 public abstract class AbstractRoad { protected AbstractCar car; public AbstractCar getCar() { return car; } public void setCar(AbstractCar car) { this.car = car; } public abstract void run(); } // 高速公路 public class SpeedWay extends AbstractRoad { public void run() { car.run(); System.out.println("高速公路上行駛"); } } // 市區街道 public class Street extends AbstractRoad { public void run() { car.run(); System.out.println("市區街道上行駛"); } } // 抽象汽車 public abstract class AbstractCar { public abstract void run(); } // 小汽車; public class Car extends AbstractCar { public void run() { System.out.println("小汽車在"); } } // 公共汽車 public class Bus extends AbstractCar { public void run() { System.out.println("公共汽車在"); } } public class Client { public static void main(String[] args) { // 小汽車在高速公路上行駛; AbstractRoad road1 = new SpeedWay(); road1.setCar(new Car()); road1.run(); // 公共汽車在高速公路上行駛; AbstractRoad road2 = new SpeedWay(); road2.setCar(new Bus()); road2.run(); } }
????
??? 增加一個維度"人",不同的人開著不同的汽車在不同的路上行駛(三個維度)
public abstract class People { protected AbstractRoad road; public AbstractRoad getRoad() { return road; } public void setRoad(AbstractRoad road) { this.road = road; } public abstract void run(); } public class Man extends People { public void run() { System.out.println("男人開著"); road.run(); } } public class WoMan extends People { public void run() { System.out.println("女人開著"); road.run(); } } public class Client { public static void main(String[] args) { // 男人開著公共汽車在高速公路上行駛; AbstractRoad road3 = new SpeedWay(); road3.setCar(new Bus()); People p = new Man(); p.setRoad(road3); p.run(); } }
?
??? 橋接模式很好的符合了開放-封閉原則和優先使用合成(而不是繼承)這兩個面向對象原則組合模式?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
