手機操做問題
如今對不一樣手機類型的不一樣品牌實現操做編程(好比:開機、關機、上網,打電話等),
如圖:java
傳統方案解決手機使用問題(類圖):編程
傳統方案解決手機操做問題分析
1) 擴展性問題(類爆炸),若是咱們再增長手機的樣式(旋轉式),就須要增長各個品牌手機的類,一樣若是咱們增長一個手機品牌,也要在各個手機樣式類下增長。
2) 違反了單一職責原則,當咱們增長手機樣式時,要同時增長全部品牌的手機,這樣增長了代碼維護成本.
3) 解決方案-使用橋接模式設計模式
橋接模式(Bridge)-基本介紹
基本介紹:
1) 橋接模式( Bridge模式 )是指:將實現與抽象放在兩個不一樣的類層次中,使兩個層次能夠獨立改變。
2) 是一種 結構型 設計模式
3) Bridge 模式基於 類的最小設計原則 ,經過使用封裝、聚合及繼承等行爲讓不一樣的類承擔不一樣的職責。它的主要特色是把抽象( Abstraction )與行爲實現( Implementation )分離開來,從而能夠保持各部分的獨立性以及應對他們的功能擴展ide
橋接模式(Bridge)-原理類圖this
1) Client類:橋接模式的調用者
2) 抽象類(Abstraction) :維護了 Implementor / 即它的實現類ConcreteImplementorA.., 兩者是聚合關係, Abstraction 充當橋接類
3) RefinedAbstraction :是抽象抽象類的子類
4) Implementor:行爲實現類的接口
5) ConcreteImplementorA/B:行爲的具體實現類
6) 從 UML 圖:這裏的抽象類和接口是聚合的關係,其實調用和被調用關係
(橋接類把 行爲接口做爲屬性)spa
橋接模式解決手機操做問題
使用橋接模式改進傳統方式,讓程序具備搞好的擴展性,利用程序維護
1) 應用實例說明(和前面要求同樣)
2) 使用橋接模式對應的類圖設計
3) 代碼實現 (橋接模式 就像 把 行爲抽象出來放入接口裏,橋接類擁有接口做爲屬性,其餘屬性設置爲 子類繼承 橋接類)blog
//接口 public interface Brand { void open(); void close(); void call(); } public class Vivo implements Brand { @Override public void open() { System.out.println(" Vivo手機開機 "); } @Override public void close() { System.out.println(" Vivo手機關機 "); } @Override public void call() { System.out.println(" Vivo手機打電話 "); } } 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 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(); } } //摺疊式手機類,繼承 抽象類 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 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(" 直立樣式手機 "); } } public class Client { public static void main(String[] args) { //獲取摺疊式手機 (樣式 + 品牌 ) Phone phone1 = new FoldedPhone(new XiaoMi()); phone1.open(); phone1.call(); phone1.close(); System.out.println("======================="); Phone phone2 = new FoldedPhone(new Vivo()); phone2.open(); phone2.call(); phone2.close(); System.out.println("=============="); UpRightPhone phone3 = new UpRightPhone(new XiaoMi()); phone3.open(); phone3.call(); phone3.close(); System.out.println("=============="); UpRightPhone phone4 = new UpRightPhone(new Vivo()); phone4.open(); phone4.call(); phone4.close(); } }
橋接模式在JDBC的源碼剖析
1) Jdbc 的 Driver接口,若是從橋接模式來看,Driver就是一個接口,下面能夠有MySQL的Driver,Oracle的Driver,這些就能夠當作實現接口類
2) 代碼分析+Debug源碼繼承
橋接模式的注意事項和細節
1) 實現了抽象和實現部分的分離,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,這有助於系統進行分層設計,從而產生更好的結構化系統。
2) 對於系統的高層部分,只須要知道抽象部分和實現部分的接口就能夠了,其它的部分由具體業務來完成。
3) 橋接模式替代多層繼承方案,能夠減小子類的個數,下降系統的管理和維護成本。
4) 橋接模式的引入增長了系統的理解和設計難度,因爲聚合關聯關係創建在抽象層,要求開發者針對抽象進行設計和編程
5) 橋接模式要求正確識別出系統中兩個獨立變化的維度,所以其使用範圍有必定的侷限性,即須要有這樣的應用場景。接口
橋接模式其它應用場景1) 對於那些不但願使用繼承或由於多層次繼承致使系統類的個數急劇增長的系統,橋接模式尤其適用.2) 常見的應用場景: -JDBC驅動程序 -銀行轉帳系統 轉帳分類: 網上轉帳,櫃檯轉帳,AMT轉帳 轉帳用戶類型:普通用戶,銀卡用戶,金卡用戶.. -消息管理 消息類型:即時消息,延時消息 消息分類:手機短信,郵件消息,QQ消息...