天天看點

Java設計模式:橋接模式

簡單來講,橋接模式是一個兩層的抽象。

橋接模式是用于“把抽象和實作分開,這樣它們就能獨立變化”。 橋接模式使用了封裝、聚合,可以用繼承将不同的功能拆分為不同的類。
           

1、橋接模式的故事

電視和遙控器(如圖)是一個完美展示兩層抽象的例子。你有一個電視機的接口,還有一個遙控器的抽象類。我們都知道,将它們中任何一個定義為一個具體類都不是好辦法,因為其它廠家會有不同的實作方法。

Java設計模式:橋接模式

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.
           

總結一下, 橋接模式允許兩層實作的抽象,上面的電視機和遙控器就是很好的例子。可見,橋接模式提供了更多的靈活性。