面向對象之橋樑模式

橋樑模式(Bridge Patter)也叫做橋接模式,是一個比較簡單的模式。

 

定義:

將抽象和實現解耦,使得兩者可以獨立地變化。

 

通用類圖:

image

 

● Abstraction——抽象化角色

它主要的職責是定義出該角色的行爲,同時保存一個對實現化角色的引用,該角色一般是抽象類。

● Implementro——實現化角色

它是接口或者抽象類,定義角色必須的行爲和屬性。

● RefinedAbstraction——修正抽象化角色

它引用實現化角色對抽象化角色進行修正。

● ConcreteImplementor——具體實現化角色

它實現接口或抽象類定義的方法和屬性。

 

其中imp的地方就是一個組合。Abstraction就是飲料這個例子裏的杯子。,它的子類RefinedAbstraction就是杯子的大小等型號。Implementor加的物品類類,ConcreteImplementorAConcreteImplementorB分別是加糖檸檬

整個設計模式的關鍵就是組合的使用。

通用代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 實現化角色
 *
 * @author Administrator
 *
 */
public interface Implementor {
 
    // 基本方法
    public void doSomething();
 
    public void doAnything();
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 具體實現化角色
 *
 * @author Administrator
 *
 */
public class ConcreteImplementor1 implements Implementor {
 
    public void doAnything() {
        // 業務處理邏輯
    }
 
    public void doSomething() {
        // 業務處理邏輯
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 具體實現化角色
 *
 * @author Administrator
 *
 */
public class ConcreteImplementor2 implements Implementor {
 
    public void doAnything() {
        // 業務處理邏輯
    }
 
    public void doSomething() {
        // 業務處理邏輯
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
 * 抽象化角色
 *
 * @author Administrator
 *
 */
public abstract class Abstraction {
 
    // 定義對實現化角色的引用
    private Implementor imp;
 
    // 約束子類必須實現該構造函數
    public Abstraction(Implementor _imp) {
        this.imp = _imp;
    }
 
    // 自身的行爲和屬性
    public void request() {
        this.imp.doSomething();
    }
 
    // 獲得實現化角色
    public Implementor getImp() {
        return this.imp;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * 具體抽象化角色
 *
 * @author Administrator
 *
 */
public class RefinedAbstraction extends Abstraction {
 
    // 覆寫構造函數
    public RefinedAbstraction(Implementor _imp) {
        super(_imp);
    }
 
    // 修正父類的行爲
    @Override
    public void request() {
        /*
         * 業務處理
         */
        super.request();
        super.getImp().doAnything();
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * 場景類
 *
 * @author Administrator
 *
 */
public class Client {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // 定義一個實現化角色
        Implementor imp = new ConcreteImplementor1();
 
        // 定義一個抽象化角色
        Abstraction abs = new RefinedAbstraction(imp);
 
        // 執行行文
        abs.request();
    }
 
}

 

橋樑模式是一個非常簡單的模式,它只是使用了類間的聚合關係、繼承、覆寫等常用功能,但是它卻提供了一個非常清晰、穩定的架構。

 

 

理解橋接模式,重點需要理解如何將抽象化(Abstraction)與實現化(Implementation)脫耦,使得二者可以獨立地變化。

•抽象化:抽象化就是忽略一些信息,把不同的實體當作同樣的實體對待。在面向對象中,將對象的共同性質抽取出來形成類的過程即爲抽象化的過程。

•實現化:針對抽象化給出的具體實現,就是實現化,抽象化與實現化是一對互逆的概念,實現化產生的對象比抽象化更具體,是對抽象化事物的進一步具體化的產物。

•脫耦:脫耦就是將抽象化和實現化之間的耦合解脫開,或者說是將它們之間的強關聯改換成弱關聯,將兩個角色之間的繼承關係改爲關聯關係。

橋樑模式的優點:

● 抽象和實現分離

這是橋樑模式的主要特點,它完全是爲了解決繼承的缺點而提出的設計模式。在該模式下,實現可以不受抽象的約束,不用再綁定在一個固定的抽象層次上。

● 優秀的擴展能力

 

● 實現細節對客戶透明

客戶不用關心細節的實現,它已經由抽象層通過聚合關係完成了封裝。

 

橋樑模式的使用場景:

● 不希望或不適用使用繼承的場景

例如繼承層次過渡、無法更細化設計顆粒等場景,需要考慮使用橋樑模式。

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

明知道接口不穩定還想通過實現或繼承來實現業務需求,那是得不償失的,也是比較失敗的做法。

● 重用性要求較高的場景

設計的顆粒度越細,則被重用的可能性就越大,而採用繼承則受父類的限制,不可能出現太細的顆粒度。

 

橋樑模式的注意事項:

使用橋樑模式時主要考慮如何拆分抽象和實現,並不是一涉及繼承就要考慮使用該模式,那還要繼承幹什麼。

橋樑模式的意圖還是對變化的封裝,儘量把可能變化的因素封裝到最細、最小的邏輯單元中,避免風險擴散。

系統設計時,發現類的繼承有N層時,可以考慮使用橋樑模式。

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