定義
將抽象部分和具體部分分離,讓他們獨立進行變化要销;也稱橋梁模式
例子1:
奶茶,分為:大杯加糖冷的奶茶谢揪、大杯加糖熱的奶茶蕉陋、大杯原味冷奶茶、大杯原味熱奶茶....
其中將大杯奶茶拨扶、小杯奶茶作為具體類。加冰茁肠、加糖作為抽象的操作患民。
最終按照需求進行操作。
(1)具體類:大杯奶茶垦梆、杯奶茶
(2)抽象操作
(3)具體操作:加糖匹颤、加冰
例子2:
未使用橋接模式的抽象與實現(xiàn)結(jié)構(gòu)圖(如下):
如果要增加一個apple品牌的電腦,則需要在臺式機下新增一個apple的臺式機托猩,在筆記本下新增一個apple筆記本印蓖,在pad下新增一個apple的pad。代碼比較繁瑣京腥。
如果使用橋接模式(如下圖)
使抽象部分和抽象的派生(實現(xiàn))部分分離出來赦肃,這樣讓它們各自的變化,這樣每種實現(xiàn)就不會影響到其他實現(xiàn)公浪。
從而達到對應(yīng)變化的目的,將電腦類型作為一個維度厅各,將品牌也做為一個維度预柒。兩個維度獨立起來队塘,可以任意的變化。
作用
橋接模式解決了多層繼承的結(jié)構(gòu)宜鸯,處理多維度變化的場景,將各個維度設(shè)計成獨立的繼承結(jié)構(gòu)顾翼。使各個維度可以獨立的擴展在抽象層建立聯(lián)系。
2.角色
- 抽象部分的抽象接口
- 抽象部分的具體實現(xiàn)
- 具體部分
3.代碼實現(xiàn)
抽象品牌維度的接口(Brand)
/**
* 品牌維度:聯(lián)想适贸,戴爾灸芳,華碩....
*/
public interface Brand {
void sale();//銷售電腦
}
具體品牌維度
class Lenovo implements Brand{
@Override
public void sale() {
System.out.println("聯(lián)想");
}
}
class Dell implements Brand{
@Override
public void sale() {
System.out.println("戴爾");
}
}
電腦類型
public class Computer {
private Brand brand;//類型維度里持有品牌維度的引用
public void sale(){
brand.sale();//具體某品牌的銷售
}
public Computer(Brand brand) {
super();
this.brand = brand;
}
}
具體的電腦類型
class Desktop extends Computer{
public Desktop(Brand brand) {
super(brand);
}
@Override
public void sale() {
super.sale();
System.out.println("臺式機");
}
}
class Laptop extends Computer{
public Laptop(Brand brand) {
super(brand);
}
@Override
public void sale() {
super.sale();
System.out.println("筆記本");
}
}
客戶端
public static void main(String[] args) {
//銷售聯(lián)想的筆記本
Computer c = new Laptop(new Lenovo());
c.sale();
}
在這里涝桅,如果想增加一個電腦類型(Pad)或者想增加一個品牌(apple),都很簡單冯遂。只需繼承類型維度(Computer)或者實現(xiàn)維度接口(Brand)即可谒获。變化某一個維度蛤肌,則不會影響到其他實現(xiàn)批狱。
應(yīng)用場景
JDBC驅(qū)動程序
AWT中的Pear架構(gòu)
-
銀行日志管理:
格式分類:操作日志,交易日志炒俱,異常日志
距離分類:本地記錄日志爪膊,異地記錄日志
-
人力資源系統(tǒng)中的獎金計算模塊:
獎金分類:個人獎金,團體獎金推盛,項目獎金,激勵獎金
部門分類:人事部榔昔,銷售部凿跳,研發(fā)部
-
OA系統(tǒng)中的消息處理:
業(yè)務(wù)類型:普通消息件豌,加急消息控嗜,特急消息
發(fā)送消息方式:系統(tǒng)內(nèi)消息曾掂,手機短信,郵件
Android中
- window和windowmanager
- adapter和adapterView