橋接模式
場景:
- 商城系統中常見的商品分類,以電腦爲類,如何良好的處理商品分類銷售的問題?
- 我們可以採用多層繼承結構實現上面的關係
- 如果使用繼承結構存在的問題
- 擴展性問題(類個數膨脹問題)
- 如果要增加一個新的電腦類型,則要增加各個品牌下面的類。
- 若果要增加一個新的品牌盤,也要增加各種電腦類型的類
- 違反單一職責原則
- 將這個場景分成兩個維度
橋接模式核心要點
- 處理多層繼承結構,處理多維度變化的場景,將各個維度設計成獨立的繼承機構,使各個維度可以獨立的擴展在抽象層建立關聯。
橋接模式總結
- 橋接模式可以取代多層繼承的方案。多層繼承違背了單一職責原則,複用性較差,類的個數也非常多。橋接模式可以極大的減少子類的個數,從而降低管理和維護的成本。
- 橋接模式極大的提高了系統的可擴展性,在兩個變化維度中任意擴展一個維度,都不需要修改原有的系統,符合開閉原則。
橋接模式在實際開發中的應用場景
- JDBC驅動程序
- AWT中的Peer構架
- 銀行日誌管理:
- 格式分類:操作日誌、交易日誌、異常日誌
- 距離分類:本地紀錄日誌、異地紀錄日誌
- 人力資源系統中的獎金計算模塊
- 獎金分類:個人獎金,團體獎金,激勵獎金
- 部門分類:人事部門,銷售部門,研發部門
- OA系統中的的消息處理:
- 業務類型:普通消息,加急消息,特急消息
- 發送消息方式:系統內消息,手機短信,郵件
示例:
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("銷售筆記本");
}
}
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("銷售神舟電腦");
}
}
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();
}
}