一. 单选题

1.桥接设计模式将抽象部分与它的实现部分相分离,使它们都可以独立地变化。下图为该设计模式的类图,其中,( )用于定义实现部分的接口。 image.png A. Abstraction B. ConcreteImplementorA C. ConcreteImplementorB D. Implementor 我的答案: D:Implementor;正确答案: D:Implementor;


  1. (单选题)以下陈述不属于桥接模式优点的是( )。 A. 分离接口及其实现部分,可以独立地扩展抽象和实现 B. 可以使原本由于接口不兼容而不能一起工作的那些类一起工作 C. 可以取代多继承方案,比多继承方案扩展性更好 D. 符合开闭原则,增加新的细化抽象和具体实现都很方便 我的答案: B:可以使原本由于接口不兼容而不能一起工作的那些类一起工作;正确答案: B:可以使原本由于接口不兼容而不能一起工作的那些类一起工作;

  1. (单选题)以下关于桥接模式的叙述错误的是( )。 A. 桥接模式的用意是将抽象化与实现化脱耦,使得两者可以独立地变化 B. 桥接模式将继承关系转换成关联关系,从而降低系统的耦合度 C. 桥接模式可以动态地给一个对象增加功能,这些功能也可以动态地撤销 D. 桥接模式可以从接口中分离实现功能,使得设计更具扩展性 我的答案: C:桥接模式可以动态地给一个对象增加功能,这些功能也可以动态地撤销;正确答案: C:桥接模式可以动态地给一个对象增加功能,这些功能也可以动态地撤销;

  1. (单选题)( )不是桥接模式所适用的场景。 A. 一个可以跨平台并支持多种格式的文件编辑器 B. 一个支持多数据源的报表生成工具,可以以不同图形方式显示报表信息 C. 一个可动态选择排序算法的数据操作工具 D. 一个支持多种编程语言的跨平台开发工具 我的答案: C:一个可动态选择排序算法的数据操作工具;正确答案: C:一个可动态选择排序算法的数据操作工具;

二. 填空题(共1题)

  1. 现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接设计模式进行设计所得类图如图1所示。 image.png 采用该设计模式的原因在于:系统解析BMP、JPEG与GIF文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。
【Java代码】
class Matrix {  //各种格式的文件最终都被转化为像素矩阵
    //此处代码省略
}
interface ImageImp {
    public void doPaint(Matrix m);  //显示像素矩阵m
}

class WinImp implements ImageImp {
    public void doPaint(Matrix m) {/*调用Windows系统的绘制函数绘制像素矩阵*/}
}

class LinuxImp implements ImageImp {
    public void doPaint(Matrix m) {/*调用Linux系统的绘制函数绘制像素矩阵*/}
}

abstract class Image {
     protected      (1)        imp; 
    public void setImp(ImageImp imp) {
            (2)       = imp; }
    public abstract void parseFile(String fileName);
}

class BMP extends Image {
    public void parseFile(String fileName) {
        //此处解析BMP文件并获得一个像素矩阵对象m
                   (3)            ;//显示像素矩阵m
    }
}

class GIF extends Image {
    //此处代码省略
}

class JPEG extends Image {
    //此处代码省略
}

public class Main{
    public static void main(String[] args)
    {
        //在Windows操作系统上查看demo.bmp图像文件
        Image image1 =      (4)      ;
        ImageImp imageImp1 =       (5)       ;
                   (6)            ;
        image1.parseFile("demo.bmp");
    }
}

现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix和类Main,若采用桥接模式则至少需要设计 (7) 个类。若不采用桥接模式,而是采用多层继承方案(图片格式为父类,操作系统为子类)则要设计 (8) 个类。

正确答案: (1) ImageImp (2) this.imp (3) imp.doPaint(m) (4) new BMP() (5) new WinImp() (6) image1.setImp(imageImp1) (7) 17 (8) 61


三. 简答题(共1题)

  1. 空客(Airbus)、波音(Boeing)、麦道(McDonnell-Douglas)都是飞机制造商,他们都可以生产载客飞机(PassengerPlane)、载货飞机(CargoPlane),请使用桥接模式来描述飞机制造商和他们生产的飞机。 1、画出UML类图(20分); image.png 2、使用Java语言编写代码(20分)。
public class Main {
   public static void main(String[] args) {
       Plane plane = (Plane) XMLUtilPlane.getBean("plane");
       PlaneMaker planeMaker = (PlaneMaker)XMLUtilPlane.getBean("planeMaker");
       planeMaker.setPlane(plane);
       planeMaker.makePlane();
   }
}



import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
public class XMLUtilPlane
{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
  public static Object getBean(String args)
  {
     try
     {
        //创建文档对象
        DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = dFactory.newDocumentBuilder();
        Document doc;                    
        doc = builder.parse(new File("homework-07/BridgeConfigPen.xml"));
        NodeList nl=null;
        Node classNode=null;
        String cName=null;
        nl = doc.getElementsByTagName("className");
       
        if(args.equals("plane"))
        {
           //获取包含类名的文本节点
              classNode=nl.item(0).getFirstChild();
             
        }
        else if(args.equals("planeMaker"))
        {
           //获取包含类名的文本节点
              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;
              }
     }
}

===========================================

public abstract class Plane {
   public abstract void showName(String company,Plane plane);
}

public class CargoPlane extends Plane{
   @Override
   public void showName(String company, Plane plane) {
       System.out.println(company + " make"+ " CargoPlane");
   }
}

public class PassengerPlane extends Plane{
   @Override
   public void showName(String company, Plane plane) {
       System.out.println(company + " make"+ " PassengerPlane");
   }
}

===========================================

public abstract class PlaneMaker {
   public Plane plane;
   public void setPlane(Plane plane) {
       this.plane=plane;
   }
   public abstract void makePlane();
}

public class Airbus extends PlaneMaker{
   @Override
   public void makePlane() {
       String company="Airbus company";
       this.plane.showName(company,this.plane);
   }
}

public class Boeing extends PlaneMaker{
   @Override
   public void makePlane() {
       String company="Boeing company";
       this.plane.showName(company,plane);
   }
}

public class McDonnellDouglas extends PlaneMaker{
   @Override
   public void makePlane() {
       String company="McDonnellDouglas company";
       this.plane.showName(company,plane);
   }
}

运行效果图 image.png