一. 单选题
1.桥接设计模式将抽象部分与它的实现部分相分离,使它们都可以独立地变化。下图为该设计模式的类图,其中,( )用于定义实现部分的接口。
A. Abstraction
B. ConcreteImplementorA
C. ConcreteImplementorB
D. Implementor
我的答案: D:Implementor;正确答案: D:Implementor;
- (单选题)以下陈述不属于桥接模式优点的是( )。 A. 分离接口及其实现部分,可以独立地扩展抽象和实现 B. 可以使原本由于接口不兼容而不能一起工作的那些类一起工作 C. 可以取代多继承方案,比多继承方案扩展性更好 D. 符合开闭原则,增加新的细化抽象和具体实现都很方便 我的答案: B:可以使原本由于接口不兼容而不能一起工作的那些类一起工作;正确答案: B:可以使原本由于接口不兼容而不能一起工作的那些类一起工作;
- (单选题)以下关于桥接模式的叙述错误的是( )。 A. 桥接模式的用意是将抽象化与实现化脱耦,使得两者可以独立地变化 B. 桥接模式将继承关系转换成关联关系,从而降低系统的耦合度 C. 桥接模式可以动态地给一个对象增加功能,这些功能也可以动态地撤销 D. 桥接模式可以从接口中分离实现功能,使得设计更具扩展性 我的答案: C:桥接模式可以动态地给一个对象增加功能,这些功能也可以动态地撤销;正确答案: C:桥接模式可以动态地给一个对象增加功能,这些功能也可以动态地撤销;
- (单选题)( )不是桥接模式所适用的场景。 A. 一个可以跨平台并支持多种格式的文件编辑器 B. 一个支持多数据源的报表生成工具,可以以不同图形方式显示报表信息 C. 一个可动态选择排序算法的数据操作工具 D. 一个支持多种编程语言的跨平台开发工具 我的答案: C:一个可动态选择排序算法的数据操作工具;正确答案: C:一个可动态选择排序算法的数据操作工具;
二. 填空题(共1题)
- 现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接设计模式进行设计所得类图如图1所示。
采用该设计模式的原因在于:系统解析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题)
- 空客(Airbus)、波音(Boeing)、麦道(McDonnell-Douglas)都是飞机制造商,他们都可以生产载客飞机(PassengerPlane)、载货飞机(CargoPlane),请使用桥接模式来描述飞机制造商和他们生产的飞机。
1、画出UML类图(20分);
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);
}
}
运行效果图