如今對不一樣手機類型的不一樣品牌實現操做編程(好比:開機、關機、上網,打電話等),如圖:java
從功能上來講,這樣設計是能夠的。可是,如果增長一種新的樣式,那麼一樣的它也會新增不一樣品牌手機的子類,這樣就會致使類爆炸的問題。編程
傳統方案解決手機操做問題分析:
一、擴展性問題(類爆炸),若是咱們再增長手機的樣式(旋轉式),就須要增長各個品牌手機的類,一樣若是咱們增長一個手機品牌,也要在各個手機樣式類下增長。
二、違反了單一職責原則,當咱們增長手機樣式時,要同時增長全部品牌的手機,這樣增長了代碼維護成本。
能夠經過橋接模式解決這個問題。設計模式
一、橋接模式(Bridge模式)是指:將實現與抽象放在兩個不一樣的類層次中,使兩個層次能夠獨立改變;
二、橋接模式是一種結構型設計模式;
三、Bridge模式基於類的最小設計原則,經過使用封裝、聚合及繼承等行爲讓不一樣的類承擔不一樣的職責。它的主要特色是把抽象(Abstraction)與行爲實現(Implementation)分離開來,從而能夠保持各部分的獨立性以及應對他們的功能擴展。ide
原理類圖說明:
一、Client類:橋接模式的調用者;
二、抽象類(Abstraction) :維護了Implementor /即它的實現類ConcreteImplementorA..,兩者是聚合關係, Abstraction充當橋接類;this
三、RedefinedAbstraction:是Abstraction抽象類的子類;設計
四、Implementor:行爲實現類的接口;3d
五、ConcreteImplementorA/B:行爲的具體實現類。code
從UML類圖中能夠看出,這裏的抽象類和接口是聚合的關係,也就是調用和被調用的關係。blog
一、手機品牌繼承
// 接口 public interface Brand { void open(); void close(); void call(); }
具體的手機品牌:小米
public class XiaoMi implements Brand { @Override public void open() { System.out.println(" 小米手機開機 "); } @Override public void close() { System.out.println(" 小米手機關機 "); } @Override public void call() { System.out.println(" 小米手機打電話 "); } }
具體的手機品牌:華爲
public class HuaWei implements Brand { @Override public void open() { System.out.println(" 華爲手機開機 "); } @Override public void close() { System.out.println(" 華爲手機關機 "); } @Override public void call() { System.out.println(" 華爲手機打電話 "); } }
二、手機樣式
手機抽象類:
public abstract class Phone { //組合品牌 private Brand brand; //構造器 public Phone(Brand brand) { super(); this.brand = brand; } protected void open() { this.brand.open(); } protected void close() { brand.close(); } protected void call() { brand.call(); } }
直立式:
public class UpRightPhone extends Phone { //構造器 public UpRightPhone(Brand brand) { super(brand); } public void open() { super.open(); System.out.println(" 直立樣式手機 "); } public void close() { super.close(); System.out.println(" 直立樣式手機 "); } public void call() { super.call(); System.out.println(" 直立樣式手機 "); } }
摺疊式:
//摺疊式手機類,繼承 抽象類 Phone public class FoldedPhone extends Phone { public FoldedPhone(Brand brand) { super(brand); } public void open() { super.open(); System.out.println(" 摺疊樣式手機 "); } public void close() { super.close(); System.out.println(" 摺疊樣式手機 "); } public void call() { super.call(); System.out.println(" 摺疊樣式手機 "); } }
三、客戶端
public class Client { public static void main(String[] args) { //獲取摺疊式手機 (樣式 + 品牌 ) Phone phoneXiaomi = new FoldedPhone(new XiaoMi()); phoneXiaomi.open(); phoneXiaomi.call(); phoneXiaomi.close(); System.out.println("======================="); Phone phoneHuaWei= new FoldedPhone(new HuaWei()); phoneHuaWei.open(); phoneHuaWei.call(); phoneHuaWei.close(); System.out.println("======================="); UpRightPhone phone3 = new UpRightPhone(new XiaoMi()); phone3.open(); phone3.call(); phone3.close(); } }
由上面的類圖咱們能夠看出來,當咱們增長蘋果手機品牌和旋轉樣式的時候,只須要增長兩個類。
一、實現了抽象和實現部分的分離,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,這有助於系統進行分層設計,從而產生更好的結構化系統; 二、對於系統的高層部分,只須要知道抽象部分和實現部分的接口就能夠了,其它的部分由具體業務來完成; 三、橋接模式替代多層繼承方案,能夠減小子類的個數,下降系統的管理和維護成本。 四、橋接模式的引入增長了系統的理解和設計難度,因爲聚合關聯關係創建在抽象層,要求開發者針對抽象進行設計和編程; 五、橋接模式要求正確識別出系統中兩個獨立變化的維度,所以其使用範圍有必定的侷限性,即須要有這樣的應用場景。