橋接模式
橋接模式是的一種對象結構型模式,它將對象的抽象與實現分離,從而可以獨立地改變它們,比如我們在JDBC中用到橋接模式,切換不同類型的數據庫,只需要切換不同類型的數據庫驅動就可以,而不需要改動太多的代碼或者配置。
定義
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
使用場景
- 如果你不希望在抽象和實現部分採用固定的綁定關係,可以採用橋接模式,來把抽象和實現部分分開,然後在程序運行期間來動態的設置抽象部分需要用到的具體的實現,還可以動態切換具體的實現。
- 類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時橋接模式使你可以對不同的抽象接口和實現部分進行組合,並分別對它們進行擴充。
- 如果希望實現部分的修改,不會對客戶產生影響,可以採用橋接模式,客戶是面向抽象的接口在運行,實現部分的修改,可以獨立於抽象部分,也就不會對客戶產生影響了,也可以說對客戶是透明的。
- 如果採用繼承的實現方案,會導致產生很多子類,對於這種情況,可以考慮採用橋接模式,分析功能變化的原因,看看是否能分離成不同的緯度,然後通過橋接模式來分離它們,從而減少子類的數目。
結構
實現
TV接口與具體類的實現
public interface ITV {
void on();
void off();
void switchChannel(int channel);
}
public class SonyTV implements ITV {
public void on() {
System.out.println("SonyTV has turn on");
}
public void off() {
System.out.println("SonyTV has turn off");
}
public void switchChannel(int channel) {
System.out.println("SonyTV switch to channel "+channel);
}
}
public class SamsungTV implements ITV {
public void on() {
System.out.println("SamsungTV has turn on");
}
public void off() {
System.out.println("SamsungTV has turn off");
}
public void switchChannel(int channel) {
System.out.println("SamsungTV switch to channel "+channel);
}
}
遙控器抽象與具體類的實現
public abstract class AbstractRemoteControl {
private ITV tv;
public AbstractRemoteControl(ITV tv) {
this.tv = tv;
}
protected void turnOn(){
tv.on();
}
protected void turnOff(){
tv.off();
}
protected void setChannel(int channel){
tv.switchChannel(channel);
}
}
public class LogitechRemoteControl extends AbstractRemoteControl {
public LogitechRemoteControl(ITV tv) {
super(tv);
}
public void turnOn(){
super.turnOn();
}
public void turnOff(){
super.turnOff();
}
public void setChannel(int channel){
super.setChannel(channel);
}
}
當我們修改TV接口的具體實現時,對於遙控器類是無感知的,同樣的修改遙控器類的具體實現時,對於TV類也是透明的,當然我們也可以很容易的擴充產品,只有實現接口或者繼承抽象類。有興趣的朋友可以查看一下JDBC的代碼,可以發現DriverManager類和Driver接口就是橋接關係,因此能實現靈活的擴展,只要產商提供Driver的實現就OK。