设计模式练习(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
- 设计模式练习(7)——桥接模式
- 设计模式练习(1)——简单工厂模式
- 设计模式练习(2)——工厂模式
- 设计模式练习(3)——抽象工厂模式
- 设计模式练习(4)——建造者模式
- 设计模式练习(5)——原型模式
- 设计模式练习(6)——适配器模式
- 设计模式练习(8)——组合模式
- 设计模式练习(9)——装饰模式
- 设计模式练习(10)——外观模式
- 设计模式练习(11)——代理模式
- 设计模式练习(12)——职责链模式
- 设计模式练习(13)——命令模式
- 设计模式练习(14)——迭代器模式
- 设计模式练习(15)——中介者模式
- 设计模式练习(16)——备忘录模式
- 设计模式练习(17)——观察者模式
- 设计模式练习(18)——状态模式
- 二叉查找树解析及其C++实现
- phpcms v9实现修改后台管理登陆路径的简单方法
- JAVA中对List<Map<String,Object>>中的中文汉字进行排序
- 数据库存储树形结构的数据
- hdu 1394 Minimum Inversion Number
- 设计模式练习(7)——桥接模式
- 关于引用的那些事
- Intellij IDEA Tomcat vm option 设置
- NIM游戏与SG函数
- 将html导出word
- hdu4825 01字典树+贪心
- Android音视频学习第3章:音视频同步实现视频播放器
- 微信小程序 - 实现一个移动端小商城
- 我学——同步和互斥