代碼示例:https://github.com/elfc/patterns
分類
類對(duì)象結(jié)構(gòu)型
意圖
將抽象部分與它的實(shí)現(xiàn)部分分離勺择,使它們都可以獨(dú)立地變化。
動(dòng)機(jī)
Bridge 模式可以將一個(gè)復(fù)雜的組件分成兩個(gè)獨(dú)立的但又相關(guān)的繼承層次結(jié)構(gòu):功能性的抽象和內(nèi)部實(shí)現(xiàn)烂叔。改變組件的這兩個(gè)層次結(jié)構(gòu)很簡(jiǎn)單,以至于它們可以相互獨(dú)立地變化至扰。當(dāng)具有抽象的層次結(jié)構(gòu)和相應(yīng)的實(shí)現(xiàn)層次結(jié)構(gòu)時(shí)桦他,Bridge模式時(shí)非常有用的。除了可以將抽象和實(shí)現(xiàn)組合成許多不同的類霹期,該模式還可以以動(dòng)態(tài)組合的獨(dú)立類的形式實(shí)現(xiàn)這些抽象和實(shí)現(xiàn)叶组。
適用性
- 想避免在抽象及其實(shí)現(xiàn)之間存在永久的綁定。
- 抽象及其實(shí)現(xiàn)可以使用子類進(jìn)行擴(kuò)展历造。
- 對(duì)一個(gè)抽象的實(shí)現(xiàn)部分的修改應(yīng)對(duì)客戶不產(chǎn)生影響甩十,即客戶的代碼不必重新編譯。
優(yōu)點(diǎn)
- 可以將接口與實(shí)現(xiàn)相分離吭产。
- 提高了可擴(kuò)展性侣监。
- 對(duì)客戶端隱藏了實(shí)現(xiàn)的細(xì)節(jié)。
結(jié)構(gòu)
參與者
- Abstraction
-- 定義抽象類的接口臣淤。
-- 維護(hù)一個(gè)指向Implementor類型對(duì)象的指針橄霉。 - RefinedAbstraction
-- 擴(kuò)充由Abstraction定義的接口。 - Implementor
-- 定義實(shí)現(xiàn)類的接口邑蒋,該接口不一定要與Abstraction的接口完全一致姓蜂;事實(shí)上這兩個(gè)接口可以完全不同。一般來說医吊,Implementor接口僅提供基本操作钱慢,而Abstraction則定義了基于這些基本操作的較高層次的操作。 - ConcreteImplementor
-- 實(shí)現(xiàn)Implementor接口并定義它的具體實(shí)現(xiàn)卿堂。
代碼示例
以一個(gè)畫圖為例束莫,用戶可以畫多種圖形(矩形, 三角形)Abstraction, 可以使用多種樣式的線畫(虛線草描、實(shí)線)Implementor
/**
* Implementor
* @author chunyuliu
*/
public interface Line {
String style();
}
/**
* ConcreteImplementor
* @author chunyuliu
*/
public class DottedLine implements Line {
@Override
public String style() {
return "虛線";
}
}
/**
* ConcreteImplementor
* @author chunyuliu
*/
public class SolidLine implements Line {
@Override
public String style() {
return "實(shí)線";
}
}
/**
* @author chunyuliu
*/
public abstract class Shape {
protected Line line;
public Shape(Line line) {
this.line = line;
}
public abstract void draw();
}
/**
* RefinedAbstraction
* @author chunyuliu
*/
public class RectangleShape extends Shape {
public RectangleShape(Line line) {
super(line);
}
@Override
public void draw() {
System.out.println("矩形, 線樣式: " + line.style());
}
}
/**
* RefinedAbstraction
* @author chunyuliu
*/
public class TriangleShape extends Shape {
public TriangleShape(Line line) {
super(line);
}
@Override
public void draw() {
System.out.println("三角形, 線樣式: " + line.style());
}
}
測(cè)試用例
/**
* @author chunyuliu
*/
public class BridgeTest {
@Test
public void shapeTest() {
// 虛線畫矩形
Shape dottedRectangle = new RectangleShape(new DottedLine());
dottedRectangle.draw();
// 實(shí)線畫矩形
Shape solidRectangle = new RectangleShape(new SolidLine());
solidRectangle.draw();
// 虛線畫三角形
Shape dottedTriangle = new TriangleShape(new DottedLine());
dottedTriangle.draw();
// 實(shí)線畫三角形
Shape solidTriangle = new RectangleShape(new SolidLine());
solidTriangle.draw();
}
}