橋接模式
一、題目:
如果需要開發一個跨平臺視頻播放器,可以在不同操作平臺(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("饑荒");
}
}
五、運行結果: