定義
如果軟件系統(tǒng)中某個(gè)類存在兩個(gè)獨(dú)立變化的維度,通過該模式可以將這兩個(gè)維度分離出來似炎,使兩者可以獨(dú)立擴(kuò)展辛萍,讓系統(tǒng)更加符合“單一職責(zé)原則”悯姊。與多層繼承方案不同,它將兩個(gè)獨(dú)立變化的維度設(shè)計(jì)為兩個(gè)獨(dú)立的繼承等級結(jié)構(gòu)贩毕, 并且在抽象層建立一個(gè)抽象關(guān)聯(lián)悯许,該關(guān)聯(lián)關(guān)系類似一條連接兩個(gè)獨(dú)立繼承結(jié)構(gòu)的橋,故名橋接模式辉阶。
UML類圖
角色和職能
- Abstract(抽象類):用于定義抽象類的接口先壕,它一般是抽象類而不是接口,其中定義了 一個(gè)Implementor(實(shí)現(xiàn)類接口)類型的對象并可以維護(hù)該對象谆甜,它與Implementor之間具有關(guān) 聯(lián)關(guān)系垃僚,它既可以包含抽象業(yè)務(wù)方法,也可以包含具體業(yè)務(wù)方法规辱。
- RefinedAbstraction(擴(kuò)充抽象類):擴(kuò)充由Abstraction定義的接口谆棺,通常情況下它不再是抽象類而是具體類,它實(shí)現(xiàn)了在Abstraction中聲明的抽象業(yè)務(wù)方法罕袋,在RefinedAbstraction中可以 調(diào)用在Implementor中定義的業(yè)務(wù)方法改淑。
- Implementor(實(shí)現(xiàn)類接口):定義實(shí)現(xiàn)類的接口,這個(gè)接口不一定要與Abstraction的接口完 全一致浴讯,事實(shí)上這兩個(gè)接口可以完全不同朵夏,一般而言,Implementor接口僅提供基本操作榆纽,而 Abstraction定義的接口可能會做更多更復(fù)雜的操作仰猖。Implementor接口對這些基本操作進(jìn)行了聲 明,而具體實(shí)現(xiàn)交給其子類掠河。通過關(guān)聯(lián)關(guān)系亮元,在Abstraction中不僅擁有自己的方法,還可以調(diào) 用到Implementor中定義的方法唠摹,使用關(guān)聯(lián)關(guān)系來替代繼承關(guān)系。
- ConcreteImplementor(具體實(shí)現(xiàn)類):具體實(shí)現(xiàn)Implementor接口奉瘤,在不同的 ConcreteImplementor中提供基本操作的不同實(shí)現(xiàn)勾拉,在程序運(yùn)行時(shí),ConcreteImplementor對象將 替換其父類對象盗温,提供給抽象類具體的業(yè)務(wù)操作方法藕赞。
思考流程
- 識別出一個(gè)類所具有的兩個(gè)獨(dú)立變化的維度,將他們設(shè)計(jì)為兩個(gè)獨(dú)立的繼承等級結(jié)構(gòu)卖局,為兩個(gè)維度都提供抽象層斧蜕。
- 通常情況下,我們將具有兩個(gè)獨(dú)立變化維度的類的一些普通業(yè)務(wù)方法和與之關(guān)系最密切的維度設(shè)計(jì)為“抽象類”層次結(jié)構(gòu)(抽象部分)砚偶,而將另一個(gè)維度設(shè)計(jì)為“實(shí)現(xiàn)類”層次結(jié)構(gòu)(實(shí)現(xiàn)部分)批销。(例如: 對于毛筆而言洒闸,由于型號是其固有的維度,因此可以設(shè)計(jì)一個(gè)抽象的毛筆類均芽,在該類中聲明 并部分實(shí)現(xiàn)毛筆的業(yè)務(wù)方法丘逸,而將各種型號的毛筆作為其子類;顏色是毛筆的另一個(gè)維度, 由于它與毛筆之間存在一種“設(shè)置”的關(guān)系掀宋,因此我們可以提供一個(gè)抽象的顏色接口深纲,而將具體 的顏色作為實(shí)現(xiàn)該接口的子類。)