簡單來講,橋接模式是一個兩層的抽象。
橋接模式是用于“把抽象和實作分開,這樣它們就能獨立變化”。 橋接模式使用了封裝、聚合,可以用繼承将不同的功能拆分為不同的類。
1、橋接模式的故事
電視和遙控器(如圖)是一個完美展示兩層抽象的例子。你有一個電視機的接口,還有一個遙控器的抽象類。我們都知道,将它們中任何一個定義為一個具體類都不是好辦法,因為其它廠家會有不同的實作方法。
2、橋接模式Java示例代碼
首先定義電視機的接口:ITV
public interface ITV {
public void on();
public void off();
public void switchChannel(int channel);
}
實作三星的 ITV 接口。
public class SamsungTV implements ITV {
@Override
public void on() {
System.out.println("Samsung is turned on.");
}
@Override
public void off() {
System.out.println("Samsung is turned off.");
}
@Override
public void switchChannel(int channel) {
System.out.println("Samsung: channel - " + channel);
}
}
再實作索尼的ITV接口。
public class SonyTV implements ITV {
@Override
public void on() {
System.out.println("Sony is turned on.");
}
@Override
public void off() {
System.out.println("Sony is turned off.");
}
@Override
public void switchChannel(int channel) {
System.out.println("Sony: channel - " + channel);
}
}
遙控器要包含對TV的引用。
public abstract class AbstractRemoteControl {
/**
* @uml.property name="tv"
* @uml.associationEnd
*/
private ITV tv;
public AbstractRemoteControl(ITV tv){
this.tv = tv;
}
public void turnOn(){
tv.on();
}
public void turnOff(){
tv.off();
}
public void setChannel(int channel){
tv.switchChannel(channel);
}
}
定義遙控器的具體類。
public class LogitechRemoteControl extends AbstractRemoteControl {
public LogitechRemoteControl(ITV tv) {
super(tv);
}
public void setChannelKeyboard(int channel){
setChannel(channel);
System.out.println("Logitech use keyword to set channel.");
}
}
public class Main {
public static void main(String[] args){
ITV tv = new SonyTV();
LogitechRemoteControl lrc = new LogitechRemoteControl(tv);
lrc.setChannelKeyboard();
}
}
輸出如下:
Sony: channel -
Logitech use keyword to set channel.
總結一下, 橋接模式允許兩層實作的抽象,上面的電視機和遙控器就是很好的例子。可見,橋接模式提供了更多的靈活性。