一. 单选题(共4题)

  1. (单选题, 2分) 当想使用一个已经存在的类,但其接口不符合需求时,可以采用( )设计模式将该类的接口转换成我们希望的接口。 A. 命令 (Command) B. 适配器 (Adapter) C. 装饰 (Decorator) D. 享元 (Flyweight) 我的答案: B:适配器 (Adapter);正确答案: B:适配器 (Adapter);

  1. (单选题, 2分)以下关于适配器模式的叙述错误的是( )。 A. 适配器模式将一个接口转换成客户希望的另一个接口,使得原本接口不兼容的那些类可以一起工作 B. 在类适配器中,Adapter和Adaptee是继承关系,而在对象适配器中,Adapter和Adaptee是关联关系 C. 类适配器比对象适配器更加灵活,在Java、C#等语言中可以通过类适配器一次适配多个适配者类 D. 适配器可以在不修改原来的适配者接口Adaptee的情况下将一个类的接口和另一个类的接口匹配起来 我的答案: C:类适配器比对象适配器更加灵活,在Java、C#等语言中可以通过类适配器一次适配多个适配者类;正确答案: C:类适配器比对象适配器更加灵活,在Java、C#等语言中可以通过类适配器一次适配多个适配者类;

  1. (单选题, 2分)现需要开发一个文件转换软件,将文件由一种格式转换为另一种格式,如将XML文件转换为PDF文件,将DOC文件转换为TXT文件,有些文件格式转换代码已经存在,为了将已有的代码应用于新软件,而不需要修改软件的整体结构,可以使用( )设计模式进行系统设计。 A. 组合 (Composite) B. 适配器 (Adapter) C. 外观 (Facade) D. 桥接 (Bridge) 我的答案: B:适配器 (Adapter);正确答案: B:适配器 (Adapter);

  1. (单选题, 2分)在对象适配器中,适配器类(Adapter)和适配者类(Adaptee)之间的关系是( )。 A. 关联关系 B. 依赖关系 C. 继承关系 D. 实现关系 我的答案: A:关联关系;正确答案: A:关联关系;

二. 多选题

  1. (多选题)以下说法正确的是( )。 A. 在类适配器中,目标类只能是接口,适配器类是适配者类的子类 B. 在类适配器中,适配器可以适配多个适配者 C. 在对象适配器中,适配器可以适配多个适配者 D. 适配器模式的优点主要是将目标类和适配者类解耦 我的答案: ACD:在类适配器中,目标类只能是接口,适配器类是适配者类的子类; 在对象适配器中,适配器可以适配多个适配者; 适配器模式的优点主要是将目标类和适配者类解耦;正确答案: ACD:在类适配器中,目标类只能是接口,适配器类是适配者类的子类; 在对象适配器中,适配器可以适配多个适配者; 适配器模式的优点主要是将目标类和适配者类解耦;

  1. (多选题) ( )不是适配器模式的应用实例。 A. 操作系统中的树形目录结构 B. Windows中的应用程序快捷方式 C. Java事件处理中的监听器接口 D. JDBC中的数据库驱动程序 我的答案: ABC:操作系统中的树形目录结构; Windows中的应用程序快捷方式; Java事件处理中的监听器接口;正确答案: ABC:操作系统中的树形目录结构; Windows中的应用程序快捷方式; Java事件处理中的监听器接口;

三. 填空题(共1题)

7.某公司欲开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示,在该公司以往的产品中已经实现了控制灯光闪烁和声音提示的程序,为了重用先前的代码并且使得汽车控制软件具有更好的灵活性和扩展性,使用适配器模式设计该系统,所得类图如图1所示。 image.png 在图1中,CarController类是汽车控制器,它包括三个方法用于控制汽车的行为,其中move()用于控制汽车的移动,sound()用于控制汽车的声音,light()用于控制汽车灯光的闪烁, sound()和light()是抽象方法。Sound类是抽象声音类,其方法phonate()用于实现声音提示,在其子类ConcreteSound中实现了该方法;Lamp类是灯光类,其方法twinkle()用于实现灯光闪烁,在其子类ConcreteLamp中实现了该方法。CarAdapter充当适配器,它通过分别调用Sound类的phonate()方法和Lamp类的twinkle()方法实现声音播放和灯光闪烁。

【Java代码】
abstract class Sound  //抽象声音类
{  public abstract void phonate();  }

class ConcreteSound extends Sound  //具体声音类
{
 public void phonate()
 {  System.out.println("声音播放!");  } 
}

abstract class Lamp  //抽象灯光类
{  public abstract void twinkle();  }

class ConcreteLamp extends Lamp  //具体灯光类
{
 public void twinkle()
 {  System.out.println("灯光闪烁!");  } 
}
           (1)            CarController  //汽车控制器
{
 public void move()
 {  System.out.println("汽车移动!");  }
 public abstract void sound();
 public abstract void light();
}

class CarAdapter            (2)             //汽车适配器
{
 private Sound sound;
 private Lamp lamp;

 public CarAdapter(Sound sound,Lamp lamp)
 {
            (3)            ;
            (4)            ;
 }

 public void sound()
 {
            (5)            ;  //声音播放
 }

 public void light()
 {
            (6)            ;  //灯光闪烁
 }
}

class Client
{
 public static void main(String args[])
 {
 Sound sound;
 Lamp lamp;
 CarController car;

 sound = new ConcreteSound();
 lamp = new ConcreteLamp();
 car =            (7)            ;

 car.move();
 car.sound();
 car.light();
 }
}

在本实例中,使用了 (8) (填写类适配器或对象适配器)模式

正确答案: (1) abstract class (2) extends CarController (3) this.sound = sound (4) this.lamp = lamp (5) sound.phonate() (6) lamp.twinkle() (7) new CarAdapter(sound, lamp) (8) 对象适配器


四. 简答题(共1题)

  1. 实现一个双向适配器实例,使得猫(Cat)可以学狗(Dog)叫,狗可以学猫抓老鼠。绘制相应类图并使用代码编程模拟。 1、画出UML类图

image.png

2、使用Java语言编程实现

public interface Cat {

   void cry();
   void catchMouse();
}

public class ConcreteCat implements Cat{
   @Override
   public void cry() {
       System.out.println("猫喵喵叫");
   }
   @Override
   public void catchMouse() {
       System.out.println("猫抓老鼠");
   }
}
public interface Dog {
   void wang();
   void action();
}

public class ConcreteDog implements Dog{
   @Override
   public void wang() {
       System.out.println("狗汪汪叫");
   }
   @Override
   public void action() {
       System.out.println("狗抓老鼠");
   }
}

public class Adapter implements Dog,Cat{
   private Cat cat;
   private Dog dog;

   public Adapter(Cat cat, Dog dog) {
       this.cat = cat;
       this.dog = dog;
   }

   @Override
   public void cry()
   {
       System.out.print( "猫学");
       dog.wang();
   }

   @Override
   public void catchMouse() {
       cat.catchMouse();
   }

   @Override
   public void wang() {
       dog.wang();
   }

   @Override
   public void action()
   {
       System.out.print( "狗学");
       cat.catchMouse();
   }
}

public class Test {
   public static void main(String args[])
   {
       Cat cat = new ConcreteCat();
       Dog dog = new ConcreteDog();
       Adapter Animal = new Adapter(cat,dog);
       cat = (Cat) Animal;
       cat.cry();
       dog = (Dog) Animal;
       dog.action();
   }
}

效果展示 image.png