4

软件体系结构与设计模式之桥接模式

 8 months ago
source link: https://blog.51cto.com/histry/9099452
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

软件体系结构与设计模式之桥接模式

精选 原创

黎大学问 2024-01-04 12:36:11 博主文章分类:软件设计模式与体系结构 ©著作权

文章标签 桥接模式 Java 设计模式 文章分类 Java 后端开发 阅读数181

一. 单选题
1.桥接设计模式将抽象部分与它的实现部分相分离,使它们都可以独立地变化。下图为该设计模式的类图,其中,( )用于定义实现部分的接口。

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

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

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

二. 填空题(共1题,40分)
5. 现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接设计模式进行设计所得类图如图1所示。

软件体系结构与设计模式之桥接模式_桥接模式_02
采用该设计模式的原因在于:系统解析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题)
6. 空客(Airbus)、波音(Boeing)、麦道(McDonnell-Douglas)都是飞机制造商,他们都可以生产载客飞机(PassengerPlane)、载货飞机(CargoPlane),请使用桥接模式来描述飞机制造商和他们生产的飞机。
1、画出UML类图(20分);

软件体系结构与设计模式之桥接模式_设计模式_03
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);
   }
}

运行效果图

软件体系结构与设计模式之桥接模式_Java_04
  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK