实验名称 桥接模式的应用 日期 2018年 04 月1 日
一、实验目的:
1) 掌握桥接模式(Bridge)的特点
2) 分析具体问题,使用桥接模式进行设计。
某软件公司要开发一个跨平台图像浏览系统,要求该系统能够显示BMP、JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、UNIX等多个操作系统上运行。系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵 显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵。另外,系统需具有较好的扩展性,以便在将来支持新的文件格式和操作系统。·
现使用桥接模式设计该跨平台图像浏览系统。
用JAVA语言实现(C#控制台应用程序实现)该模式。绘制该模式的UML图。
模式UML图】
二、实验环境:
三、实验内容:
【模式代码】
package 实验8;
public class BMPImage extends Image {
public void parseFile(String fileName){
Matrix matrix = new Matrix();
imageImp.doPaint(matrix);
System.out.println(fileName + " BMP图片");
}
}
<?xml version="1.0"?>
<config>
<!--RefinedAbstraction-->
<className>实验8.JPGImage</className>
<!--ConcreteImplementor-->
<className>实验8.WindowsImp</className>
</config>
package 实验8;
public class GIFImage extends Image {
public void parseFile(String fileName){
Matrix matrix = new Matrix();
imageImp.doPaint(matrix);
System.out.println(fileName + ".GIF");
}
}
package 实验8;
public abstract class Image {
protected ImageImp imageImp;
public void setImageImp(ImageImp imageImp){
this.imageImp = imageImp;
}
public abstract void parseFile(String fileName);
}
package 实验8;
public interface ImageImp {
public void doPaint(Matrix matrix);
}
package 实验8;
public class JPGImage extends Image{
public void parseFile(String fileName){
Matrix matrix = new Matrix();
imageImp.doPaint(matrix);
System.out.println(fileName + ".JPG");
}
}
package 实验8;
public class Matrix {
}
package 实验8;
public class PNGImage extends Image {
public void parseFile(String fileName){
Matrix matrix = new Matrix();
imageImp.doPaint(matrix);
System.out.println(fileName + ".PNG");
}
}
package 实验8;
public class UnixImp implements ImageImp{
public void doPaint(Matrix matrix){
System.out.println("在Unix系统显示图片:");
}
}
package 实验8;
public class WindowsImp implements ImageImp {
public void doPaint(Matrix matrix){
System.out.println("在Windows系统显示图片:");
}
}
package 实验8;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;
import java.io.*;
public class XMLUtil {
public static Object getBean(String args){
try {
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("D:\\软件集合\\IntelliJ IDEA Community Edition 2018.3.2\\JAVA\\JAVA\\src\\实验8\\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;
}
}
}
package 实验8;
public class ImageTest {
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("李云龙");
// Image BMP=new BMPImage();
// ImageImp windowsImp = new WindowsImp();
// BMP.setImageImp(windowsImp);
// BMP.parseFile("李云龙");
//
// BMP.setImageImp(new UnixImp());
// BMP.parseFile("楚云飞");
}
}
【运行截图】
四、心得体会:
桥接模式主要适用于以下情况:
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。