设计模式练习(7)——桥接模式

来源:互联网 发布:战略家炒股软件 编辑:程序博客网 时间:2024/06/06 10:57

桥接模式

一、题目:

如果需要开发一个跨平台视频播放器,可以在不同操作平台(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("饥荒");          }  }

五、运行结果:

这里写图片描述

0 0
原创粉丝点击