试题五1. 阅读下列说明和C++代码,完成空缺部分。
【说明】 某软件系统中,已设计并实现了用于显示地址信息的类Address(如图1所示),现要求提供基于Dutch语言的地址信息显示接口。为了实现该要求并考虑到以后可能还会出现新的语言的接口,决定采用适配器(Adapter)模式实现该要求,得到如图1所示的类图。
图1 适配器模式类图 【C++代码】 #include <iostream>
using namespace std;
class Address {
public:
void street() { /*实现代码省略*/ }
void zip() { /*实现代码省略*/ }
void city() { /*实现代码省略*/ }
//其他成员省略
};
class DutchAddress {
public:
virtual void straat()=0;
virtual void postcode()=0;
virtual void plaats()=0;
//其他成员省略
};
class DutchAddressAdapter:public DutchAddress{
private:
______;
public:
DutchAddressAdapter(Address *addr) {
address=addr;
}
void straat() {
______;
}
void postcode() {
______;
}
void plaats() {
______;
}
//其他成员省略
};
void testDutch(DutchAddress *addr) {
addr->straat();
addr->postcode();
addr->plaats();
}
int main() {
Address *addr=new Address();
______;
cout <<"\n The DutchAddress\n" <<endl;
testDutch(addrAdapter);
return 0;
}
Address *address
address->street()
address->zip()
address->city()
DutchAddress *addrAdapter=new DutchAddressAdapter(addr)
[解析]
本题考查Adapter(适配器)模式的基本概念和应用。
Adapter模式的设计意图是,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Adapter模式有两种实现方式。类适配使用多重继承对一个接口与另一个接口进行匹配,其结构如图2所示。
图2 类适配器结构图 对象适配器依赖于对象组合,其结构如图3所示。
图3 对象适配器结构图 ●
Target定义Client使用的与特定领域相关的接口。
●Client与符合
Target接口的对象协同。
●Adaptee定义一个已经存在的接口,这个接口需要适配。
●Adapter对Adaptee的接口与
Target接口进行适配。
Adapter模式适用于:
●想使用一个已经存在的类,而它的接口不符合要求。
●想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
●(仅适用于对象Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配它的父类接口。
本题中采用对象适配器,题中类DutchAdddressAdapter对应图3中的Adapter、DutchAddress对应图3中的Target、Address对应图3中的Adaptee。
由图3可知,在Adapter中应该有一个Adaptee的对象,因此第1空处应该填写的是Address的对象:Address *address。
类DutchAddress的实现采用了C++中的抽象类,作为其子类DutchAddressAdapter,必须对DutchAddress中的3个纯虚拟函数进行重置,所以第2~4空是在考查这3个纯虚拟函数在子类中的实现方式。由图3可知,Adapter中方法的实现方式还是要借助于Adaptee中所提供的行为,也就是说,DutchAddressAdapter中3个纯虚拟函数的实现与Address是密不可分的。由此可知,第2~4空分别应填入:address->street()、address->zip()和address->city()。
第5空考查Adapter模式的使用。这里调用普通函数testDutch来进行测试,这个函数要求传递DutchAddress类型的参数,并且给出了实参的名字:addrAdatper。因此第5空应该填写的是addrAdapter的创建语句,这里需要使用到DutchAddress的构造函数。因此第5空应填写:DutchAddress *addrAdapter=new DutchAddressAdapter(addr)。
试题六1. 阅读下列说明和Java代码,完成空缺部分。
【说明】 某软件系统中,已设计并实现了用于显示地址信息的类Address(如图1所示),现要求提供基于Dutch语言的地址信息显示接口。为了实现该要求并考虑到以后可能还会出现新的语言的接口,决定采用适配器(Adapter)模式实现该要求,得到如图1所示的类图。
图1 适配器模式类图 【Java代码】 import java.util.*;
class Address {
public void street() { //实现代码省略 }
public void zip() { //实现代码省略 }
public void city() { //实现代码省略 }
//其他成员省略
}
class DutchAddress {
public void straat() { //实现代码省略 }
public void postcode() { //实现代码省略 }
public void plaats() { //实现代码省略 }
//其他成员省略
class DutchAddressAdapter extends DutchAddress {
private ______;
public DutchAddressAdapter(Address addr) {
address=addr;
}
public void straat() {
______;
}
public void postcode() {
______;
}
public void plaats() {
______;
}
//其他成员省略
}
class Test {
public static void main(String[] args) {
Address addr=new Address();
______;
System.out.println("\n The DutchAddress\n");
testDutch(addrAdapter);
}
static void testDutch(DutchAddress addr) {
addr.straat();
addr.postcode();
addr.plaats();
}
}
Address address
address.street()
address.zip()
address.city()
DutchAddress addrAdapter=new DutchAddressAdapter(addr)
[解析]
本题考查Adapter(适配器)模式的基本概念和应用。
Adapter模式的设计意图是,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Adapter模式有两种实现方式。类适配使用多重继承对一个接口与另一个接口进行匹配,其结构如图2所示。
图2 类适配器结构图 对象适配器依赖于对象组合,其结构如图3所示。
图3 对象适配器结构图 ●
Target定义Client使用的与特定领域相关的接口。
●Client与符合
Target接口的对象协同。
●Adaptee定义一个已经存在的接口,这个接口需要适配。
●Adapter对Adaptee的接口与
Target接口进行适配。
Adapter模式适用于:
●想使用一个已经存在的类,而它的接口不符合要求。
●想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
●(仅适用于对象Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配它的父类接口。
本题中采用对象适配器,题中类DutchAdddressAdapter对应图3中的Adapter、DutchAddress对应图3中的Target、Address对应图3中的Adaptee。
由图3可知,在Adapter中应该有一个Adaptee的对象,因此第1空处应该填写的是Address的对象:Address address。
第2~4空考查父类中的3个方法在子类DutchAddressAdapter的实现方式。由图3可知,Adapter中方法的实现方式还是要借助于Adaptee中所提供的行为,也就是说,DutchAddressAdapter中3个方法的实现与Address是密不可分的。由此可知,第2~4空分别应填入:address.street()、address.zip()和address.city()。
第5空考查Adapter模式的使用。这里使用方法testDutch来进行测试,这个方法要求传递DutchAddress类型的参数,并且给出了实参的名字:addrAdatper。因此第5空应该填写的是addrAdapter的创建语句,这里需要使用到DutchAddress的构造函数。因此第5空应填写:DutchAddress addrAdapter=new DutchAddressAdapter(addr)。