概念:
橋接模式將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化。它是用組合關(guān)系代替繼承關(guān)系來(lái)實(shí)現(xiàn),從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式。
橋接模式包含以下角色:
抽象化(Abstraction)角色:定義抽象類,并包含一個(gè)實(shí)現(xiàn)化對(duì)象的引用
擴(kuò)展抽象化(Refined Abstraction)角色:是抽象化角色的子類,實(shí)現(xiàn)父類中的業(yè)務(wù)方法,并通過(guò)組合關(guān)系調(diào)用實(shí)現(xiàn)化角色中的業(yè)務(wù)方法
實(shí)現(xiàn)化(Implementor)角色:定義實(shí)現(xiàn)化角色的接口,供擴(kuò)展化角色調(diào)用
具體實(shí)現(xiàn)化(Concrete Implementor)角色:給出實(shí)現(xiàn)化角色的具體實(shí)現(xiàn)
實(shí)現(xiàn)案例:
給出商店(實(shí)現(xiàn)化角色Shop)
給出水果店和蔬菜店(兩個(gè)具體實(shí)現(xiàn)化角色Fruits、Vegetables)
定義人類(抽象化角色People),其中聚合了實(shí)現(xiàn)化角色
定義具體人(擴(kuò)展抽象化角色ZhangSan)繼承抽象化角色
//實(shí)現(xiàn)化角色 (商店)
public interface Shop {
void sell(String name);
}
//具體實(shí)現(xiàn)化角色 (水果店)
public class Fruits implements Shop {
@Override
public void sell(String name) {
System.out.println("水果店: " + name);
}
}
//具體實(shí)現(xiàn)化角色 (蔬菜店)
public class Vegetables implements Shop {
@Override
public void sell(String name) {
System.out.println("蔬菜店: " + name);
}
}
//抽象化角色 (人)
public abstract class People {
protected Shop shop;
public People(Shop shop) {
this.shop = shop;
}
public abstract void buy(String name);
}
//擴(kuò)展抽象化角色 (張三)
public class ZhangSan extends People {
public ZhangSan(Shop shop) {
super(shop);
}
@Override
public void buy(String name) {
shop.sell(name);
}
}
public class Test {
public static void main(String[] args) {
People people = new ZhangSan(new Vegetables());
people.buy("大白菜");
People people1 = new ZhangSan(new Fruits());
people1.buy("蘋果");
}
}
測(cè)試輸出結(jié)果:

當(dāng)需要增加其他類型的商店時(shí),只需要增加一個(gè)具體實(shí)現(xiàn)化角色即可;當(dāng)有其他人去購(gòu)買時(shí),只需要增加擴(kuò)展抽象化角色即可。橋接模式,大大增加了系統(tǒng)的擴(kuò)展性。
優(yōu)點(diǎn):
1、抽象和實(shí)現(xiàn)的分離。
2、優(yōu)秀的擴(kuò)展能力。
3、實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶透明。
缺點(diǎn):
橋接模式的引入會(huì)增加系統(tǒng)的理解與設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開(kāi)發(fā)者針對(duì)抽象進(jìn)行設(shè)計(jì)與編程
使用場(chǎng)景:
1、當(dāng)一個(gè)類存在兩個(gè)獨(dú)立變化的維度,且這兩個(gè)維度都需要進(jìn)行擴(kuò)展
2、當(dāng)一個(gè)系統(tǒng)不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類個(gè)數(shù)急劇增加時(shí)
3、當(dāng)一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性時(shí),避免在兩個(gè)層次之間建立靜態(tài)的繼承關(guān)系,通過(guò)橋接模式可以使他們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系。