1.定義
使抽象和實作解耦,使之都可以獨立擴充不會影響對方
2.使用場景及設計
2.1.場景
現在有十種不同類型的電視,每種電視都有自己的遙控器,電視變化,對應的遙控器也要變化,而且如果新增一種電視型号,就要新增一種對應的遙控器
2.2.設計
使用橋接模式制作一個抽象tv接口,在抽象出一個RemoteControl遙控器類,使用RemoteControl類關聯(橋接)tv接口,将實作予以解耦,而且抽象和實作可以獨立擴充互不影響,如想給RemoteControl加個game功能,則不會對現有實作影響
2.3.類圖
3.測試代碼
入口代碼
package com.glt.designpattern.bridge;
public class InitMain {
public static void main(String[] args) {
TV mi = new MiTV();
TV sony = new SonyTV();
ConcreteRemote miControl = new ConcreteRemote(mi);
ConcreteRemote sonyControl = new ConcreteRemote(sony);
miControl.on();
miControl.setStation(5);
miControl.nextChannel();
sonyControl.on();
sonyControl.setStation(10);
sonyControl.nextChannel();
}
}
package com.glt.designpattern.bridge;
/**
* 電視接口
*/
public interface TV {
/**
* 開
*/
public void on();
/**
* 關
*/
public void off();
/**
* 切換頻道
*/
public void tuneChannel(int channel);
}
package com.glt.designpattern.bridge;
/**
* 抽象遙控器類
*/
public abstract class RemoteControl {
TV tv;
public RemoteControl(TV tv) {
this.tv = tv;
}
public void on() {
tv.on();
}
public void off() {
tv.off();
}
public void setChannel(int channel) {
tv.tuneChannel(channel);
}
}
package com.glt.designpattern.bridge;
/**
* 具體遙控器類
*/
public class ConcreteRemote extends RemoteControl {
public int currentStation = 0;
public ConcreteRemote(TV tv) {
super(tv);
}
public void on() {
super.on();
}
public void off() {
super.on();
}
public void setStation(int currentStation) {
this.currentStation = currentStation;
setChannel(this.currentStation);
}
public void nextChannel() {
setChannel(this.currentStation + 1);
}
public void prevChannel() {
setChannel(this.currentStation - 1);
}
}
package com.glt.designpattern.bridge;
/**
* 小米-具體電視類
*/
public class MiTV implements TV {
@Override
public void on() {
System.out.println("open xiaomi tv ...");
}
@Override
public void off() {
System.out.println("close xiaomi tv ...");
}
@Override
public void tuneChannel(int channel) {
System.out.println(String.format("change xiaomi tv channel is %s", channel));
}
}
package com.glt.designpattern.bridge;
/**
* 索尼-具體電視類
*/
public class SonyTV implements TV {
@Override
public void on() {
System.out.println("open sony tv ...");
}
@Override
public void off() {
System.out.println("close sony tv ...");
}
@Override
public void tuneChannel(int channel) {
System.out.println(String.format("change sony tv channel is %s", channel));
}
}
輸出如下
open xiaomi tv …
change xiaomi tv channel is 5
change xiaomi tv channel is 6
open sony tv …
change sony tv channel is 10
change sony tv channel is 11
4.總結
橋接模式其實也是為了抽象和實作解耦,通過橋接類保證tv和遙控器兩個次元互不影響單獨改變。
-
優點
1、抽象和實作的分離。
2、優秀的擴充能力。
3、實作細節對客戶透明
-
缺點
橋接會增加系統了解與設計的複雜程度,增加開發者的開發難度。