天天看點

23種經典設計模式的java實作_3_橋接模式

橋接模式的适用:

你不希望在抽象和它的實作部分之間有一個固定的綁定關系。例如:程式的實作部分在運作時需要被選擇或者切換。

類的抽象以及它的實作都應該可以通過生成子類的方法加以擴充。這時Bridge模式使你可以對不同的抽象接口和實作部分進行組合,并分别對它們進行擴充。

對一個抽象實作的修改需要對客戶不産生影響,即客戶的代碼不必重新編譯。

有許多類要生成。這種情況下你必須将一個對象分解成兩個部分。這種類層次結構為“嵌套的普化”。

你想在多個對象間共享實作(可能使用引用計數),但同時要求客戶并不知道這一點。

示例說明:

接口IText定義了字型的最終展現,但其的具體實作TextImpLinux和TextImpMac并不用作對外使用(即向客戶暴露)。

那麼,我們使用抽象類AbstractText對IText的具體實作進行“橋接”,即在這兩個真實的實作和最終對外使用的字型類TextBold和TextItalic之間建造了一座橋梁,這座橋梁是通過TextBold和TextItalic繼承抽象類AbstractText實作的。

最終,結果就是,字型具有了新的特性Bold和Italic但又不失自己的基本屬性Linux和Mac。

這就是我們想要的。

字型接口及其兩個基本實作——具有Linux風格或Mac風格的字型:

package com.alex.designpattern.bridge;

/** *//**

 * @serialData 2007

 */

public interface IText ...{

    public void DrawTextImp();

}

 * The ConcreteImplementor

public class TextImpLinux implements IText ...{

    public void DrawTextImp() ...{

        System.out.println("The text has a Linux style.");

    }

public class TextImpMac implements IText ...{

        System.out.println("The text has a Mac style.");

 這個抽象類可以看作是一個橋梁,它被用來“橋接”字型的基本實作與字型的附加特性,使字型的屬性得到無綁定的擴充:

 * The Abstract of Text<br>

 * Set the Text's System Style

 * <p>

 * This abstract class is a bridge,<br>

 * it can bridge "System Style" to real implemention "Text Style" of IText.

 * 

public abstract class AbstractText ...{

    public abstract void DrawText(String text);

    protected IText GetTextImp(String type) ...{

        if (type.equals("Mac")) ...{

            return new TextImpMac();

        } else if (type.equals("Linux")) ...{

            return new TextImpLinux();

        } else ...{

        }

那麼,以下就是字型的附加特性——粗體和斜體,它們通過實作抽象類AbstractText來與基本屬性的實作結合:

 * The RefinedAbstraction

public class TextBold extends AbstractText ...{

    private IText imp;

    public TextBold(String type) ...{

        imp = GetTextImp(type);

    public void DrawText(String text) ...{

        System.out.println(text);

        System.out.println("The text is bold text.");

        imp.DrawTextImp();

public class TextItalic extends AbstractText ...{

    public TextItalic(String type) ...{

        System.out.println("The text is italic text.");

最後,當然是測試啟動類啦,通過可以測試我們對這個模式的實作:

 * 橋接模式

 * 将抽象部分與它的實作部分分離,使它們都可以獨立地變化。

public class Test ...{

    public static void main(String[] args) ...{

        AbstractText myText = new TextBold("Mac");

        myText.DrawText("=== A test String ===");

        System.out.println("------------------------------------------");

        myText = new TextBold("Linux");

        myText = new TextItalic("Mac");

        myText = new TextItalic("Linux");

你還等什麼呢?複制下來運作它試試看吧——如果你還對“橋接”模式不了解的話。

     本文轉自胡奇 51CTO部落格,原文連結:http://blog.51cto.com/huqicto/280902,如需轉載請自行聯系原作者