設計模式練習(7)——橋接模式

橋接模式

一、題目:

如果需要開發一個跨平臺視頻播放器,可以在不同操作平臺(Windows、Linux、UNIX等)播放多種格式的視頻文件,如PMEG、RMVB、AVI、WMV等常見適配格式,現使用橋接模式設計播放器。
(1)繪製橋接模式結構視圖
給出實例類圖並實現代碼。。

二、所用模式結構視圖:

這裏寫圖片描述

三、實例類圖:

這裏寫圖片描述

四、實例實現代碼:

(因爲區分,所以在類的前面加了Gj19)

播放視頻類:輔助類

package BridgePatter;
/**
 * 播放視頻類:輔助類,各種格式的文件最終都被轉化爲視頻,
 * 不同的操作系統提供不同的方式播放視頻 
 * @author gong
 *
 */
public class Gj19Matrix {
    public static void main(String[] args) {
        System.out.println("播放視頻");
    }
}

抽象視頻類:抽象類

package BridgePatter;
/**
 * 抽象視頻類:抽象類
 * @author gong
 *
 */
abstract class Gj19Video {
    protected Gj19VideoImpl gj19impl;

    public Gj19VideoImpl getGj19impl() {
        return gj19impl;
    }

    public void setGj19impl(Gj19VideoImpl gj19impl) {
        this.gj19impl = gj19impl;
    }

    public abstract void parseFile(String fileName);
}

抽象操作系統實現類:實現類接口

package BridgePatter;
/**
 * 抽象操作系統實現類:實現類接口 
 * @author gong
 *
 */
public interface Gj19VideoImpl {
    public void doPaint(Gj19Matrix m);  //顯示視頻矩陣
}

Windows操作系統實現類:具體實現類

package BridgePatter;
/**
 * Windows操作系統實現類:具體實現類
 * @author gong
 *
 */
public class Gj19WindowsImpl implements Gj19VideoImpl {

    @Override
    public void doPaint(Gj19Matrix m) {
        //調用Windows系統的播放函數播放視頻
        System.out.println("在windows操作系統中播放視頻");

    }

}

Linux操作系統實現類:具體實現類

package BridgePatter;
/**
 * Linux操作系統實現類:具體實現類
 * @author gong
 *
 */
public class Gj19LinuxImpl implements Gj19VideoImpl {

    @Override
    public void doPaint(Gj19Matrix m) {
        //調用Linux系統的播放函數播放視頻
        System.out.println("在Linux操作系統中播放視頻");
    }

}

Unix操作系統實現類:具體實現類

package BridgePatter;
/**
 * Unix操作系統實現類:具體實現類
 * @author gong
 *
 */
public class Gj19UnixImpl implements Gj19VideoImpl {

    @Override
    public void doPaint(Gj19Matrix m) {
        //調用Unix系統的播放函數播放視頻
        System.out.println("在Unix操作系統中播放視頻");
    }

}

PMEG格式視頻:擴充抽象類

package BridgePatter;
/**
 * PMEG格式視頻:擴充抽象類  
 * @author gong
 *
 */
public class Gj19PMEGVideo extends Gj19Video{

    @Override
    public void parseFile(String fileName) {
        //模擬解析PMEG文件並獲得一個播放視頻對象;    
        Gj19Matrix m = new Gj19Matrix();
        gj19impl.doPaint(m);
        System.out.println(fileName+",格式爲PMEG");
    }

}

RMVB格式視頻:擴充抽象類

package BridgePatter;
/**
 * RMVB格式視頻:擴充抽象類  
 * @author gong
 *
 */
public class Gj19RMVBVideo extends Gj19Video{

    @Override
    public void parseFile(String fileName) {
        //模擬解析RMVB文件並獲得一個播放視頻對象;    
        Gj19Matrix m = new Gj19Matrix();
        gj19impl.doPaint(m);
        System.out.println(fileName+",格式爲RMVB");
    }

}

WMV格式視頻:擴充抽象類

package BridgePatter;
/**
 * WMV格式視頻:擴充抽象類  
 * @author gong
 *
 */
public class Gj19WMVVideo extends Gj19Video{

    @Override
    public void parseFile(String fileName) {
        //模擬解析WMV文件並獲得一個播放視頻對象; 
        Gj19Matrix m = new Gj19Matrix();
        gj19impl.doPaint(m);
        System.out.println(fileName+",格式爲WMV");
    }

}

AVI格式視頻:擴充抽象類

package BridgePatter;
/**
 * AVI格式視頻:擴充抽象類  
 * @author gong
 *
 */
public class Gj19AVIVideo extends Gj19Video{

    @Override
    public void parseFile(String fileName) {
        //模擬解析AVI文件並獲得一個播放視頻對象; 
        Gj19Matrix m = new Gj19Matrix();
        gj19impl.doPaint(m);
        System.out.println(fileName+",格式爲AVI");
    }

}

用於讀取配置文件config.xml並反射生成對象的XMLUtil類的代碼

package BridgePatter;
/**
 *  用於讀取配置文件config.xml並反射生成對象的XMLUtil類的代碼
 */
import javax.xml.parsers.*;  
import org.w3c.dom.*;  
import java.io.*;  
public class Gj19XMLUtil {  
//該方法用於從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;  
          }  
    }

}  

XMl配置文件

<?xml version="1.0" encoding="UTF-8"?>
<config>  
    <className>BridgePatter.Gj19RMEGVideo</className>   
    <className>BridgePatter.Gj19WindowsImpl</className>  
</config>

客戶端測試類

package BridgePatter;
/**
 * 客戶端測試類
 * @author gong
 *
 */
public class Gj19Client {
     public static void main(String args[]) {  
            Gj19Video gj19Video;  
            Gj19VideoImpl gj19VideoImpl;  
            gj19Video = (Gj19Video)Gj19XMLUtil.getBean("gj19Video");  
            gj19VideoImpl = (Gj19VideoImpl)Gj19XMLUtil.getBean("os");  
            gj19Video.setGj19impl(gj19VideoImpl);  
            gj19Video.parseFile("饑荒");  
        }  
}

五、運行結果:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章