設計模式 _第十七招式_橋樑模式

一、定義

橋樑模式(Bridge Pattern)也叫做橋接模式,是一個比較簡單的模式,將抽象和實現解耦,使得二者可以獨立的變化。
橋樑模式的重點是“解耦”,如何讓它們兩者解耦是我們要了解的重點;

二、代碼演示

2.1 通用類圖

2.2 角色說明

  • Abstraciton–抽象化角色
    它主要職責是定義出該角色的行爲,同事保存一個對實現化角色的引用,該角色一般是抽象類。
  • Implementor–實現化角色
    它是接口或抽象類,定義角色必須的行爲和屬性。
  • RefinedAbstraciton–修正抽象化角色
    它引用實現化角色對象化角色進行修正。
  • ConcreteImplementor-具體實現化角色
    它實現接口或抽象類定義的方法和屬性。

大家記住一句話:抽象角色引用實現角色,或抽象角色部分功能由實現角色完成。

2.3 實現化角色

package com.design.bridge.pattern;

/**
 * @description 實現化角色
 * @date: 2019/9/28 20:13
 * @version: v 0.1
 */
public interface Implementor {
    public  void  doSomething();
    public  void doAnything();
}

2.4 具體實現化角色

package com.design.bridge.pattern;

/**
 * @description 具體實現化角色
 * @date: 2019/9/28 20:21
 * @version: v 0.1
 */
public class ConcreteImplementor1 implements Implementor {
    public void doSomething() {
        //業務邏輯處理
        System.out.println("ConcreteImplementor1 doSomething");
    }

    public void doAnything() {
        //業務邏輯處理
        System.out.println("ConcreteImplementor1 doAnything");
    }
}

package com.design.bridge.pattern;

/**
 * @description 具體實現化角色
 * @date: 2019/9/28 20:21
 * @version: v 0.1
 */
public class ConcreteImplementor2 implements Implementor {
    public void doSomething() {
        //業務邏輯處理
        System.out.println("ConcreteImplementor2 doSomething");
    }

    public void doAnything() {
        //業務邏輯處理
        System.out.println("ConcreteImplementor2 doAnything");
    }
}

上面定義了兩個具體實現化角色—代表兩個不同的業務邏輯。

2.5 抽象化角色

package com.design.bridge.pattern;

/**
 * @description 抽象化角色
 * @date: 2019/9/28 20:26
 * @version: v 0.1
 */
public class Abstraction {
    //定義對實現角色的引用
    private Implementor imp;

    //約束子類必須實現該構造函數
    public Abstraction(Implementor _imp) {
        this.imp = _imp;
    }

    //自身行爲和屬性
    public void request() {
        this.imp.doSomething();
    }

    //獲取實現化角色
    public Implementor getImp() {
        return imp;
    }
}

爲什麼要增加一個構造函數呢 ?答案是爲了提醒子類,必須做這項工作。

2.6 具體抽象化角色

package com.design.bridge.pattern;


/**
 * @description 具體抽象化角色
 * @date: 2019/9/28 20:29
 * @version: v 0.1
 */
public class RefindAbstraction extends Abstraction {
    //覆寫構造函數
    public RefindAbstraction(Implementor _imp) {
        super(_imp);
    }

    //修正父類的行爲
    @Override
    public void request() {
        //業務處理
        super.request();
        super.getImp().doAnything();
    }
}

實現化角色有很多子接口,如果在構造函數中不傳一個儘量明確的實現者,代碼就很不清晰。

2.7 運行結果

ConcreteImplementor1 doSomething
ConcreteImplementor1 doAnything

三、優點

抽象與實現分離
這是橋樑模式的主要特點,它是爲了解決繼承缺點而提出的設計模式,在該模式中,實現可以不受抽象的約束,不用再綁定在一個固定的抽象層次上。
優秀的擴展能力
可以增加抽象,只要對外暴露的接口允許這樣的變化。
實現細節對象客戶透明
客戶不用關係細節的實現,它已經抽象層通過聚合關係完成封裝。

四、缺點

可能會出現,子類太多導致,類膨脹。

五、應用場景

  • 不希望或不適合使用繼承使用場景
    例如繼承的過渡,無法更細化設計等場景,需要考慮用橋樑模式。
  • 接口或抽象類不穩定的場景
    接口不穩定還想通過實現或集成來實現業務需求的場景。
  • 重用性要求較高的場景
    設計的粒度越細,則被重用的可能性越大。

六、注意事項

橋樑模式非常簡單,使用該模式,主要考慮怎樣拆分抽象和實現,橋樑模式的意圖是對變化的封裝,儘量可能變化的部分封裝爲最小,避免風險擴散。如果發現系統設計時,類的繼承有N層時,可以考慮使用橋樑模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章