主要的作用
將抽象與實現解耦,可以讓抽象和實現獨立的變化。
關鍵角色
(1)Abstraction:抽象角色,這個角色提供的接口是面向調用方的,其中會保持一個對實現化對象的引用,其中的真正實現就是由Implementor的實現類來提供的,Implementor就相當於一個橋樑,將抽象角色和具體的實現關聯了起來,使用組合的方式,而不是繼承的方式。
(2)RefinedAbstraction:修正抽象化角色,主要是Abstraction這個抽象角色可能沒有提供過多的接口,可以通過RefinedAbstraction來擴展功能。
(3)Implementor:實現化角色,這個角色就是相當於一個橋樑,只給出接口而不給出具體的實現。
(4)具體實現化角色:就是Implementor這個接口的實現類,實現類纔是真正提供功能的地方。
案例
- 案例一:自定義demo
public class BridgeBase {
private static Abstractor abstractor;
/**
* 抽象化角色
*/
static abstract class Abstractor {
// 通過聚合模式保持對實現化角色的引用
private Implementer implementer;
public Abstractor(Implementer implementer) {
this.implementer = implementer;
}
abstract void print();
public Implementer getImplementer() {
return implementer;
}
}
/**
* 實現化角色
*/
static abstract class Implementer {
abstract String say(String s);
}
static class HiAbstractor extends Abstractor {
public HiAbstractor(Implementer implementer) {
super(implementer);
}
@Override
void print() {
System.out.println("hi" + getImplementer().say("zzz"));
}
}
static class HelloAbstractor extends Abstractor {
public HelloAbstractor(Implementer implementer) {
super(implementer);
}
@Override
void print() {
System.out.println("hello" + getImplementer().say(" what?"));
}
}
static class LowImplementer extends Implementer {
@Override
String say(String s) {
return s + " GG";
}
}
static class HighImplementer extends Implementer {
@Override
String say(String s) {
return s + "MM";
}
}
public static void main(String[] args) {
Abstractor abstractor = new HelloAbstractor(new LowImplementer());
abstractor.print();
}
}
- 案例二:JDBC的連接的設計
Driver是相當於一個橋樑,對於mysql、oracle等數據庫實現肯定是不一樣的,只需要基於Driver提供不同的實現類即可。將抽象和實現解耦。
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
上面就是mysql提供的基於Driver橋樑的一個實現類。
其實好好想想,感覺面向接口編程都有着一絲絲橋樑模式的影子。比如依賴於spring的依賴注入功能,就是根據需要提供不同的實現,能夠將抽閒和實現解耦了。
這裏先簡單介紹下橋樑模式,等後面我把每種設計模式都理解清楚了,再一起總結下。
再次說明一下,這個模式的關鍵在於能夠將抽象和實現解耦。就像是一個公司,中臺負責搭架子,不同的業務提供具體的實現,這樣就不需要把過重的業務完全放到中臺了,中臺就可以提供一些通用性的功能。