橋接模式的适用:
你不希望在抽象和它的實作部分之間有一個固定的綁定關系。例如:程式的實作部分在運作時需要被選擇或者切換。
類的抽象以及它的實作都應該可以通過生成子類的方法加以擴充。這時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,如需轉載請自行聯系原作者