<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 處理多維度變化——橋接模式(三) 10.3 完整解決方案 為了減少所需生成的子類數目,實現將操作系統和圖像文件格式兩個維度分離,使它們可以獨立改變,Sunny公司開發人員使用橋接模式來重構跨平臺圖像瀏覽系統的設計,其基本結構如圖10-5所示: ![](http://my.csdn.net/uploads/201204/16/1334506504_5936.gif) 在圖10-5中,Image充當抽象類,其子類JPGImage、PNGImage、BMPImage和GIFImage充當擴充抽象類;ImageImp充當實現類接口,其子類WindowsImp、LinuxImp和UnixImp充當具體實現類。完整代碼如下所示: ``` //像素矩陣類:輔助類,各種格式的文件最終都被轉化為像素矩陣,不同的操作系統提供不同的方式顯示像素矩陣 class Matrix { //此處代碼省略 } //抽象圖像類:抽象類 abstract class Image { protected ImageImp imp; public void setImageImp(ImageImp imp) { this.imp = imp; } public abstract void parseFile(String fileName); } //抽象操作系統實現類:實現類接口 interface ImageImp { public void doPaint(Matrix m); //顯示像素矩陣m } //Windows操作系統實現類:具體實現類 class WindowsImp implements ImageImp { public void doPaint(Matrix m) { //調用Windows系統的繪制函數繪制像素矩陣 System.out.print("在Windows操作系統中顯示圖像:"); } } //Linux操作系統實現類:具體實現類 class LinuxImp implements ImageImp { public void doPaint(Matrix m) { //調用Linux系統的繪制函數繪制像素矩陣 System.out.print("在Linux操作系統中顯示圖像:"); } } //Unix操作系統實現類:具體實現類 class UnixImp implements ImageImp { public void doPaint(Matrix m) { //調用Unix系統的繪制函數繪制像素矩陣 System.out.print("在Unix操作系統中顯示圖像:"); } } //JPG格式圖像:擴充抽象類 class JPGImage extends Image { public void parseFile(String fileName) { //模擬解析JPG文件并獲得一個像素矩陣對象m; Matrix m = new Matrix(); imp.doPaint(m); System.out.println(fileName + ",格式為JPG。"); } } //PNG格式圖像:擴充抽象類 class PNGImage extends Image { public void parseFile(String fileName) { //模擬解析PNG文件并獲得一個像素矩陣對象m; Matrix m = new Matrix(); imp.doPaint(m); System.out.println(fileName + ",格式為PNG。"); } } //BMP格式圖像:擴充抽象類 class BMPImage extends Image { public void parseFile(String fileName) { //模擬解析BMP文件并獲得一個像素矩陣對象m; Matrix m = new Matrix(); imp.doPaint(m); System.out.println(fileName + ",格式為BMP。"); } } //GIF格式圖像:擴充抽象類 class GIFImage extends Image { public void parseFile(String fileName) { //模擬解析GIF文件并獲得一個像素矩陣對象m; Matrix m = new Matrix(); imp.doPaint(m); System.out.println(fileName + ",格式為GIF。"); } } ``` 為了讓系統具有更好的靈活性和可擴展性,我們引入了配置文件,將具體擴充抽象類和具體實現類類名都存儲在配置文件中,再通過反射生成對象,將生成的具體實現類對象注入到擴充抽象類對象中,其中,配置文件config.xml的代碼如下所示: ``` <?xml version="1.0"?> <config> <!--RefinedAbstraction--> <className>JPGImage</className> <!--ConcreteImplementor--> <className>WindowsImp</className> </config> ``` 用于讀取配置文件config.xml并反射生成對象的XMLUtil類的代碼如下所示: ``` import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; import java.io.*; public class XMLUtil { //該方法用于從XML配置文件中提取具體類類名,并返回一個實例對象 public static Object getBean(String args) { try { //創建文檔對象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("config.xml")); NodeList nl=null; Node classNode=null; String cName=null; nl = doc.getElementsByTagName("className"); if(args.equals("image")) { //獲取第一個包含類名的節點,即擴充抽象類 classNode=nl.item(0).getFirstChild(); } else if(args.equals("os")) { //獲取第二個包含類名的節點,即具體實現類 classNode=nl.item(1).getFirstChild(); } cName=classNode.getNodeValue(); //通過類名生成實例對象并將其返回 Class c=Class.forName(cName); Object obj=c.newInstance(); return obj; } catch(Exception e) { e.printStackTrace(); return null; } } } ``` 編寫如下客戶端測試代碼: ``` class Client { public static void main(String args[]) { Image image; ImageImp imp; image = (Image)XMLUtil.getBean("image"); imp = (ImageImp)XMLUtil.getBean("os"); image.setImageImp(imp); image.parseFile("小龍女"); } } ``` 編譯并運行程序,輸出結果如下: ``` 在Windows操作系統中顯示圖像:小龍女,格式為JPG。 ``` 如果需要更換圖像文件格式或者更換操作系統,只需修改配置文件即可,在實際使用時,可以通過分析圖像文件格式后綴名來確定具體的文件格式,在程序運行時獲取操作系統信息來確定操作系統類型,無須使用配置文件。當增加新的圖像文件格式或者操作系統時,原有系統無須做任何修改,只需增加一個對應的擴充抽象類或具體實現類即可,系統具有較好的可擴展性,完全符合“開閉原則”。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看