1. 程式人生 > 其它 >05-02-設計模式 橋接模式

05-02-設計模式 橋接模式

手機操作問題

現在對不同手機型別的不同品牌實現操作程式設計(比如:開機、關機、上網,打電話等),如圖:

傳統解決方案

類圖

問題分析

  1. 擴充套件性問題(類爆炸),如果我們再增加手機的樣式(旋轉式),就需要增加各個品牌手機的類,同樣如果我們增加一個手機品牌,也要在各個手機樣式類下增加。
  2. 違反了單一職責原則,當我們增加手機樣式時,要同時增加所有品牌的手機,這樣增加了程式碼維護成本.
  3. 解決方案-使用橋接模式

橋接模式

基本介紹

  1. 橋接模式(Bridge模式)是指:將實現與抽象放在兩個不同的類層次中,使兩個層次可以獨立改變。
  2. 是一種結構型設計模式
  3. Bridge模式基於類的最小設計原則,通過使用封裝、聚合及繼承等行為讓不同的類承擔不同的職責。它的主要特點是把抽象(Abstraction)與行為實現(Implementation)分離開來,從而可以保持各部分的獨立性以及應對他們的功能擴充套件

原理類圖

  • 上圖說明
  • Client類: 橋接模式的呼叫者
  • 抽象類(Abstraction): :維護了Implementor/即它的實現類ConcreteImplementorA..,二者是聚合關係,Abstraction充當橋接類
  • RefinedAbstraction:是Abstraction抽象類的子類
  • Implementor:行為實現類的介面
  • ConcreteImplementorA/B:行為的具體實現類
  • 從UML圖:這裡的抽象類和介面是聚合的關係,其實呼叫和被呼叫關係

橋接模式解決方案

思路

使用橋接模式改進傳統方式,讓程式具有搞好的擴充套件性,利用程式維護

  1. 應用例項說明(和前面要求一樣)
  2. 使用橋接模式對應的類圖

程式碼實現

package com.flower.qiaojie;

public class TestMain {
    public static void main(String[] args) {
        Phone phone = new FoldedPhone(new Xiaomi());
        phone.open();
        phone.call();
        phone.close();
    }
}
interface Brand{
    void open();
    void call();
    void close();
}
class Xiaomi implements Brand{

    @Override
    public void open() {
        System.out.println("小米手機open...");
    }

    @Override
    public void call() {
        System.out.println("小米手機call...");
    }

    @Override
    public void close() {
        System.out.println("小米手機close...");
    }
}
class Vivo implements Brand{

    @Override
    public void open() {
        System.out.println("Vivo手機open...");
    }

    @Override
    public void call() {
        System.out.println("Vivo手機call...");
    }

    @Override
    public void close() {
        System.out.println("Vivo手機close...");
    }
}
abstract class Phone{
    protected Brand brand;

    public Phone(Brand brand) {
        this.brand = brand;
    }

    protected void open(){
        brand.open();
    }

    protected void close(){
        brand.close();
    }

    protected void call(){
        brand.call();
    }
}

class FoldedPhone extends Phone{

    public FoldedPhone(Brand brand) {
        super(brand);
    }

    @Override
    protected void open() {
        System.out.println("摺疊式手機開啟");
        super.open();
    }

    @Override
    protected void close() {
        System.out.println("摺疊式手機關閉");
        super.close();
    }

    @Override
    protected void call() {
        System.out.println("摺疊式手機打電話");
        super.call();
    }
}

類圖

原始碼剖析

JDBC原始碼

橋接模式在JDBC的原始碼剖析

  1. JDBC的Driver介面, 如果從橋接模式來看, Driver就是一個介面, 下面可以有MySQL的Driver,Oracle的Driver, 這些就可以當做介面的實現類

程式碼分析+Debug

類圖

橋接模式的注意事項和細節

  1. 實現了抽象和實現部分的分離,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,這有助於系統進行分層設計,從而產生更好的結構化系統。
  2. 對於系統的高層部分,只需要知道抽象部分和實現部分的介面就可以了,其它的部分由具體業務來完成。
  3. 橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本。
  4. 橋接模式的引入增加了系統的理解和設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計和程式設計
  5. 橋接模式要求正確識別出系統中兩個獨立變化的維度(抽象、和實現),因此其使用範圍有一定的侷限性,即需要有這樣的應用場景。橋接模式其它應用場景

對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用.

常見的應用場景

  • JDBC驅動程式
  • 銀行轉賬系統
    • 轉賬分類:網上轉賬,櫃檯轉賬,AMT轉賬
    • 轉賬使用者型別:普通使用者,銀卡使用者,金卡使用者..
  • 訊息管理
    • 訊息型別:即時訊息,延時訊息
    • 訊息分類:手機簡訊,郵件訊息,QQ訊息.