GOF 23設計模式之 橋接模式

橋接模式

場景:

  • 商城系統中常見的商品分類,以電腦爲類,如何良好的處理商品分類銷售的問題?
  • 我們可以採用多層繼承結構實現上面的關係
  • 如果使用繼承結構存在的問題
    類繼承模式
    • 擴展性問題(類個數膨脹問題)
      • 如果要增加一個新的電腦類型,則要增加各個品牌下面的類。
      • 若果要增加一個新的品牌盤,也要增加各種電腦類型的類
    • 違反單一職責原則
      • 一個類:聯想筆記本,有兩個引起這個類變化的原因。
  • 將這個場景分成兩個維度
    兩個維度示意圖
    • 兩種以上的維度使用橋接模式符合單一職責原則

橋接模式核心要點

  • 處理多層繼承結構,處理多維度變化的場景,將各個維度設計成獨立的繼承機構,使各個維度可以獨立的擴展在抽象層建立關聯。

橋接模式總結

  1. 橋接模式可以取代多層繼承的方案。多層繼承違背了單一職責原則,複用性較差,類的個數也非常多。橋接模式可以極大的減少子類的個數,從而降低管理和維護的成本。
  2. 橋接模式極大的提高了系統的可擴展性,在兩個變化維度中任意擴展一個維度,都不需要修改原有的系統,符合開閉原則。

橋接模式在實際開發中的應用場景

  • JDBC驅動程序
  • AWT中的Peer構架
  • 銀行日誌管理:
    • 格式分類:操作日誌、交易日誌、異常日誌
    • 距離分類:本地紀錄日誌、異地紀錄日誌
  • 人力資源系統中的獎金計算模塊
    • 獎金分類:個人獎金,團體獎金,激勵獎金
    • 部門分類:人事部門,銷售部門,研發部門
  • OA系統中的的消息處理:
    • 業務類型:普通消息,加急消息,特急消息
    • 發送消息方式:系統內消息,手機短信,郵件

示例:

  • Computer類
package com.coderbean.bridge;

/**
 * Created by Chang on 15/9/29.
 */
public class Computer {
    protected Brand brand;

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

    public void sale(){
        brand.sale();
    }
}

class Desktop extends Computer {
    public Desktop(Brand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        super.sale();
        System.out.println("銷售臺式機");
    }
}

class Labtop extends Computer {
    public Labtop(Brand brand) {
        super(brand);
    }

    @Override
    public void sale() {
        super.sale();
        System.out.println("銷售筆記本");
    }
}
  • Brand接口
package com.coderbean.bridge;

/**
 * 品牌
 * Created by Chang on 15/9/29.
 */
public interface Brand {
    void sale();
}

class Lenovo implements Brand{
    @Override
    public void sale() {
        System.out.println("銷售聯想電腦");
    }
}

class Dell implements Brand{
    @Override
    public void sale() {
        System.out.println("銷售戴爾電腦");
    }
}

class Shenzhou implements Brand {
    @Override
    public void sale() {
        System.out.println("銷售神舟電腦");
    }
}
  • Client類
package com.coderbean.bridge;

/**
 * Created by Chang on 15/9/29.
 */
public class Client {
    public static void main(String[] args) {
        //銷售聯想的筆記本電腦
        Computer c = new Labtop(new Lenovo());
        c.sale();

        //銷售神舟筆記本
        Computer c2 = new Desktop(new Shenzhou());
        c2.sale();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章