23种经典设计模式的java实现_3_桥接模式
生活随笔
收集整理的這篇文章主要介紹了
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; /** *//**
?* @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
?* @serialData 2007
?*/
public interface IText ...{
??? public void DrawTextImp();
} package com.alex.designpattern.bridge; /** *//**
?* The ConcreteImplementor
?*/
public class TextImpLinux implements IText ...{
??? public void DrawTextImp() ...{
??????? System.out.println("The text has a Linux style.");
??? }
} package com.alex.designpattern.bridge; /** *//**
?* The ConcreteImplementor
?*/
public class TextImpMac implements IText ...{
??? public void DrawTextImp() ...{
??????? System.out.println("The text has a Mac style.");
??? }
}
?這個抽象類可以看作是一個橋梁,它被用來“橋接”字體的基本實現與字體的附加特性,使字體的屬性得到無綁定的擴充: package com.alex.designpattern.bridge; /** *//**
?* 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.
?*
?* @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
?* @serialData 2007
?*/
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 ...{
??????????? return new TextImpMac();
??????? }
??? }
}
那么,以下就是字體的附加特性——粗體和斜體,它們通過實現抽象類AbstractText來與基本屬性的實現結合: package com.alex.designpattern.bridge; /** *//**
?* The RefinedAbstraction
?*
?* @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
?* @serialData 2007
?*/
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();
??? }
} package com.alex.designpattern.bridge; /** *//**
?* The RefinedAbstraction
?*
?* @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
?* @serialData 2007
?*/
public class TextItalic extends AbstractText ...{
??? private IText imp; public TextItalic(String type) ...{
??????? imp = GetTextImp(type);
??? } public void DrawText(String text) ...{
??????? System.out.println(text);
??????? System.out.println("The text is italic text.");
??????? imp.DrawTextImp();
??? }
}
最后,當然是測試啟動類啦,通過可以測試我們對這個模式的實現: package com.alex.designpattern.bridge; /** *//**
?* 橋接模式
?* <p>
?* 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
?*
?* @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
?* @serialData 2007
?*/
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.DrawText("=== A test String ==="); System.out.println("------------------------------------------"); myText = new TextItalic("Mac");
??????? myText.DrawText("=== A test String ==="); System.out.println("------------------------------------------"); myText = new TextItalic("Linux");
??????? myText.DrawText("=== A test String ===");
??? }
}
你還等什么呢?復制下來運行它試試看吧——如果你還對“橋接”模式不了解的話。 ?
?* @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
?* @serialData 2007
?*/
public interface IText ...{
??? public void DrawTextImp();
} package com.alex.designpattern.bridge; /** *//**
?* The ConcreteImplementor
?*/
public class TextImpLinux implements IText ...{
??? public void DrawTextImp() ...{
??????? System.out.println("The text has a Linux style.");
??? }
} package com.alex.designpattern.bridge; /** *//**
?* The ConcreteImplementor
?*/
public class TextImpMac implements IText ...{
??? public void DrawTextImp() ...{
??????? System.out.println("The text has a Mac style.");
??? }
}
?這個抽象類可以看作是一個橋梁,它被用來“橋接”字體的基本實現與字體的附加特性,使字體的屬性得到無綁定的擴充: package com.alex.designpattern.bridge; /** *//**
?* 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.
?*
?* @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
?* @serialData 2007
?*/
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 ...{
??????????? return new TextImpMac();
??????? }
??? }
}
那么,以下就是字體的附加特性——粗體和斜體,它們通過實現抽象類AbstractText來與基本屬性的實現結合: package com.alex.designpattern.bridge; /** *//**
?* The RefinedAbstraction
?*
?* @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
?* @serialData 2007
?*/
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();
??? }
} package com.alex.designpattern.bridge; /** *//**
?* The RefinedAbstraction
?*
?* @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
?* @serialData 2007
?*/
public class TextItalic extends AbstractText ...{
??? private IText imp; public TextItalic(String type) ...{
??????? imp = GetTextImp(type);
??? } public void DrawText(String text) ...{
??????? System.out.println(text);
??????? System.out.println("The text is italic text.");
??????? imp.DrawTextImp();
??? }
}
最后,當然是測試啟動類啦,通過可以測試我們對這個模式的實現: package com.alex.designpattern.bridge; /** *//**
?* 橋接模式
?* <p>
?* 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
?*
?* @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
?* @serialData 2007
?*/
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.DrawText("=== A test String ==="); System.out.println("------------------------------------------"); myText = new TextItalic("Mac");
??????? myText.DrawText("=== A test String ==="); System.out.println("------------------------------------------"); myText = new TextItalic("Linux");
??????? myText.DrawText("=== A test String ===");
??? }
}
你還等什么呢?復制下來運行它試試看吧——如果你還對“橋接”模式不了解的話。 ?
轉載于:https://blog.51cto.com/huqicto/280902
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的23种经典设计模式的java实现_3_桥接模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软 Mozilla高管评Safari
- 下一篇: 联通的网络终于好了