原文地址:LoveDev
橋接模式是種很實(shí)用的結(jié)構(gòu)型設(shè)計(jì)模式,又稱為柄體模式或接口模式,該模式可以將兩個(gè)維度的變化分離開(kāi),讓系統(tǒng)更符合“單一職責(zé)原則”,與多層繼承方案不同,它將兩個(gè)獨(dú)立變化的維度設(shè)計(jì)為兩個(gè)獨(dú)立的繼承等級(jí)結(jié)構(gòu),并在抽象層建立抽象關(guān)聯(lián),該關(guān)聯(lián)關(guān)系類似一條連接兩個(gè)獨(dú)立繼承結(jié)構(gòu)的橋,故而叫橋接模式

- Abstraction(抽象類):一般是抽象類,其中定義一個(gè) Implementor 類型的對(duì)象,它與 Implementor 之間具有關(guān)聯(lián)關(guān)系。該類可以包含抽象業(yè)務(wù)方法,也可以包含具體業(yè)務(wù)方法
- RefineAbstraction(擴(kuò)展抽象類):一般是具體類而不是抽象類,實(shí)現(xiàn) Abstraction 中的抽象方法
- Implementor(實(shí)現(xiàn)類接口):該接口一般情況僅提供基本操作,Abstraction 中做更多更復(fù)雜的操作,Implementor 接口對(duì)這些基本操作進(jìn)行聲明,具體實(shí)現(xiàn)交給子類,通過(guò)關(guān)聯(lián)關(guān)系,Abstraction 不僅擁有自己的方法,還可以調(diào)用 Implementor 中的方法,使用關(guān)聯(lián)關(guān)系代替繼承關(guān)系
- ConcreteImplementor(具體實(shí)現(xiàn)類):代替父類對(duì)象,提供給抽象類做具體的業(yè)務(wù)
舉一個(gè)衣服店的例子,店里現(xiàn)在只剩下兩種衣服,黃色 XXL 號(hào)和紅色 M 號(hào)的,衣服這個(gè)對(duì)象具有至少兩個(gè)維度的變化,一個(gè)是衣服尺碼,一個(gè)是衣服顏色,現(xiàn)在來(lái)看用橋接模式實(shí)現(xiàn)衣服對(duì)象的代碼示例:
Implementor 類:
public interface Color {
String dyeing();
}
ConcreteImplementor 類:
public class Yellow implements Color {
@Override
public String dyeing() {
return "黃色";
}
}
Abstraction 類:
public abstract class Clothes {
public Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void getClothes();
}
RefineAbstraction 類:
public class XXLClothes extends Clothes {
@Override
public void getClothes() {
String s = null;
if (color != null) {
s = color.dyeing();
}
LogUtils.i(s + "XXL號(hào)的衣服");
}
}
Client 類:
Yellow yellow = new Yellow();
XXLClothes xxlClothes = new XXLClothes();
xxlClothes.setColor(yellow);
xxlClothes.getClothes();
現(xiàn)在需要增加幾種衣服的類型,就會(huì)很快捷方便,也遵守“開(kāi)閉原則”比如增加一個(gè)粉色 L 號(hào)衣服對(duì)象,首先增加一個(gè) RefineAbstraction 類:
public class LClothes extends Clothes {
@Override
public void getClothes() {
String s = null;
if (color != null) {
s = color.dyeing();
}
LogUtils.i(s + "L號(hào)的衣服");
}
}
再添加一個(gè) ConcreteImplementor 類:
public class Pink implements Color {
@Override
public String dyeing() {
return "粉色";
}
}
Client 類:
Yellow Pink = new Pink();
LClothes lClothes = new LClothes();
lClothes.setColor(Pink);
lClothes.getClothes();
橋接模式中體現(xiàn)了很多面向?qū)ο笤O(shè)計(jì)原則的思想:
- 單一職責(zé)原則:一個(gè)類負(fù)責(zé)一項(xiàng)職責(zé)
- 開(kāi)閉原則:開(kāi)放擴(kuò)展,關(guān)閉修改
- 里氏替換:子類能完全替代父類
- 依賴倒置:不依賴細(xì)節(jié),依賴抽象
橋接模式的好處有很多,但是對(duì)使用者有一定的經(jīng)驗(yàn)要求,需要正確識(shí)別獨(dú)立變化的兩個(gè)維度,以及一開(kāi)始就要對(duì)抽象層進(jìn)行設(shè)計(jì)