橋接模式

前言

適配器模式能夠在不改變目標代碼的狀況下,經過引入適配類來給目標類擴展功能。橋接模式也是一種結構型模式。微信

如下沒有更形象生動的介紹,結合平時所寫代碼進行理解爲佳markdown

目錄

1、定義

將抽象和實現解耦,使得二者能夠獨立變化。這裏的抽象和實現能夠理解爲抽象實體和抽象出行爲函數

2、模式原理分析

打個比方,你有一家房地產公司,後面增長了新業務,成立了新的公司,專門快速山寨其它行業爆品性能

//抽象公司 公司共有屬性
public abstract class Corp{
	//生產
    protected abstract void produce();
    //賣產品
    protected abstract void sell();
    //公司開始運營掙錢
    public void run(){
        this.produce();
        this.sell();
    }
}

//你的房地產公司
public class HouseCorp extends Corp(){
    protected void produce(){
        System.out.println("工人替老闆蓋房子並給工人發工資");
    }
    protected void sell(){
        System.out.println("工人拿到工資後,再借錢向老闆買房子");
    }
}
//新開的山寨服裝公司
public class ClothesCorp extends Corp{
    protected void produce(){
        System.out.println("回收舊衣服,加以利用");
    }
    protected void sell(){
        System.out.println("舊衣服到底賣不賣");
    }
}
//場景類
public class Client{
    public static void main(String[] args){
        HouseCorp houseCrop = new HouseCorp();
        houseCorp.run();
        ClothesCorp clothesCorp = new ClothesCorp();
        clothesCorp.run();
    }
}
複製代碼

若是山寨衣服的公司不想生產衣服了,怎麼辦?刪除這個類,而後新建一個具備新產品的類嗎?這樣的代碼改動,也就是新建一個類繼承Corp,你能夠接受嗎?前期是能夠的,後期若是變化快,那豈不是場景類中須要大量修改代碼。咱們能夠轉變思惟,抽象出產品類,每次你只要指定生產哪一個產品就能夠了,只要符合規範。this

現利用橋接模式改成spa

//抽象產品類
public abstract class Product{
    public abstract void beProducted();
    public abstract void beSelled();
}
//房子  產品
public class House extends Product{
    public void beProducted(){
        System.out.println("生產房子");
    }
    public void beSelled(){
        System.out.println("賣房子");
    }
}

//山寨衣服  產品
public class Clothes extends Product{
    public void beProducted(){
        System.out.println("生產衣服");
    }
    public void beSelled(){
        System.out.println("賣衣服");
    }
}

//抽象公司
public abstract class Corp{
    private Product product;
    public Corp(Product product){
        this.product = product;
    }
    public void run(){
    	//生產產品
        this.product.beProducted();
        //賣產品
        this.product.beSelled();
    }
}
//房產公司
public class HouseCorp extends Corp{
    public HouseCorp(House house){
        super(house);
    }
    public void run(){
        super.run();
    }
}
//山寨公司
public class ShanZhaiCorp extend Corp{
    public ShanZhaiCorp(Product product){
        super(product);
    }
    public void run(){
        super.run();
    }
}
//場景類
public class Client{
    public static void main(String[] args){
        House house = new House();
        HouseCorp houseCorp = new HouseCorp(house);
        houseCorp.run();
        ShanZhaiCorp shanZhaiCorp = new ShanZhaiCorp(new Clothes());
        shanZhaiCorp.run();
    }
}
複製代碼

這裏的構造函數,主要是爲了提醒子類,你必須作這項工做。之後每次山寨產品,擴展,只須要增長公司,繼承Corp類,增長對應產品類。設計

對應於抽象和實現分離,這裏Product能夠認爲是實現化,Corp能夠認爲是抽象化,Product的子類 與ShanZhaiCorp 已經分離了。山寨公司ShanZhaiCorp實現類,包含了抽象行爲類Product以及實現了抽象行爲runcode

3、使用場景

  • 不但願使用繼承的場景orm

  • 接口或抽象類不穩定的場景對象

  • 基於消息驅動的場景。 雖然消息的行爲比較統一,主要包括髮送、接收、處理和回執,但其實具體客戶端的實現一般卻各不相同,好比,手機短信、郵件消息、QQ 消息、微信消息等。

  • 拆分複雜的類對象時。 當一個類中包含大量對象和方法時,既不方便閱讀,也不方便修改。

  • 須要在運行時切換不一樣實現方法時。 好比,經過門面模式調用外部 RPC 服務。

  • 重用性要求高的場景。設計的顆粒度越細,重用的可能性就越大,採用繼承的方式受父類的限制。

4、優勢

  • 抽象和實現分離

    • 解決了繼承的缺點,實現能夠不受抽象的約束
  • 優秀的擴充能力

    • 增長Product的實現,能夠把變化縮減至最小
  • 實現細節對客戶透明

    • 不用關心細節如何,只須要完成產品實現

5、缺點

  • 增長了維護成本,用組合和聚合關係不像繼承關係那樣容易找到對象之間的調用關係,稍不注意就會影響到其餘對象

  • 增長了設計難度,橋接模式更重視聚合而非繼承關係,須要創建更多的抽象層

  • 性能降低,組合或者聚合關係,簡化理解的同時,調用對象變多了

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息