1、中级软件设计师下午试题-122 及答案解析(总分:90.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.现欲实现一个图像浏览系统,要求该系统能够显示 BMP、JPEG 和 GIF 三种格式的文件,并且能够在Windows 和 Linux 两种操作系统上运行。系统首先将 BMP、JPEG 和 GIF 三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计所得类图如图所示。 (分数:15.00)_二、B试题二/B(总题数:1,分数:
2、15.00)2.某大型商场内安装了多个简易的纸巾售卖机,自动出售 2 元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图 1 所示。图 1 纸巾售卖机状态图采用状态(State)模式来实现该纸巾售卖机,得到如图 2 所示的类图。其中类 State 为抽象类,定义了投币、退币、出纸巾等方法接口。类 SoldState、SoldOutState、NoQuarterState 和 HasQuarterState 分别对应图 1 中纸巾售卖机的 4 种状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。(分数:15.00)_三、B试题三/B(总题数:1,分数:15.00)3.某咖啡店当卖咖啡时
3、,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表所示。 咖啡及配料的种类和价格表咖 啡 价格/杯 配 料 价格/份蒸馏咖啡(Espresso) 25 摩卡(Mocha) 10深度烘焙咖啡(DarkRoast) 20 奶泡(Whip) 8现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图所示的类图。 (分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)4.已知某类库开发商提供了一套类库,类库中定义了 Application 类和 Document 类,它们之间的关系如图所示。其中,Applic
4、ation 类表示应用程序自身,而 Document 类则表示应用程序打开的文档。Application 类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个 Document 对象表示了。 (分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)5.某大型商场内安装了多个简易的纸巾售卖机,自动出售 2 元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图 1 所示。图 1 纸巾售卖机状态图采用状态(State)模式来实现该纸巾售卖机,得到如图 2 所示的类图。其中,类 State 为抽象类,定义了投币、退币、出纸巾等方法接口。类 S
5、oldState、SoldOutState、NoQuarterState 和 HasQuarterState 分别对应图 1 中纸巾售卖机的 4 种状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。(分数:15.00)_六、B试题六/B(总题数:1,分数:15.00)6.某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表所示。 咖啡及配料的种类和价格表咖啡 价格/杯 配料 价格/份蒸馏咖啡(Espresso) 25 摩卡(Mocha) 10深度烘焙咖啡(DarkRoast) 20 奶泡(Whip) 8现采用装饰
6、器(Decorator)模式来实现计算费用的功能,得到如图所示的类图。 (分数:15.00)_中级软件设计师下午试题-122 答案解析(总分:90.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.现欲实现一个图像浏览系统,要求该系统能够显示 BMP、JPEG 和 GIF 三种格式的文件,并且能够在Windows 和 Linux 两种操作系统上运行。系统首先将 BMP、JPEG 和 GIF 三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设
7、计模式进行设计所得类图如图所示。 (分数:15.00)_正确答案:(1)this-imp (2)ImageImp (3)imp-doPaint(m) (4)new BMP() (5)new WinImap() (6)image1-setImp(ImageImp1) (7)17)解析:解析 本题考查基本面向对象设计模式的运用能力。 由文字描述和 UML 结构图可知 BMP、GIF 与JPEG 是 Image 的子类,分别负责读取不同格式的文件。ImageImp 的主要任务是将像素矩阵显示在屏幕上,它的两个子类 WinImp、LinuxImp 分别实现 Windows 系统和 Linux 系统上的
8、图像显示代码。空(1)处主要设置在哪个平台上进行实现,由于该类的成员变量也是 imp,与参数相同,因此应填 this-imp。同理,该成员变量的类型和参数的类型应保持相同,故空(2)处应填 ImageImp。空(3)处需要根据 imp 成员变量存储的实现对象来显示图像,应填 imp-doPaint(m)。在空(4)处需要生成一个 BMP 对象,故应填 new BMP(),在空(5)处需要生成一个 WinImp 对象,故应填 new WinImp(),空(6)处应填 image1-setImp(ImageImp1),采用 Bridge(桥接模式)能够将文件分析代码和图像显示代码分解在不同的类层结
9、构中,如果不考虑Matrix 等类,那么最后需要设计的类包括 2 个父类,分别为文件格式子类和操作系统平台类,故系统需要支持 10 种格式的图像文件和 5 种操作系统至少需要 17 个类。二、B试题二/B(总题数:1,分数:15.00)2.某大型商场内安装了多个简易的纸巾售卖机,自动出售 2 元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图 1 所示。图 1 纸巾售卖机状态图采用状态(State)模式来实现该纸巾售卖机,得到如图 2 所示的类图。其中类 State 为抽象类,定义了投币、退币、出纸巾等方法接口。类 SoldState、SoldOutState、NoQuarterSt
10、ate 和 HasQuarterState 分别对应图 1 中纸巾售卖机的 4 种状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。(分数:15.00)_正确答案:(1)State (2)tissueMachine-getHasQuarterState() (3)tissueMachine-getNoQuarterState() (4)tissueMachine-getNoQuarterState() (5)tissueMachine-getSoldOutState()解析:解析 本题考查基本面向对象设计模式的运用能力。 状态设计模式主要是能够使一个对象的内在状态改变时允许改变其行为,使这个对
11、象看起来像是改变了其类。由类图可知类 State 是类SoldState、SoldOutState、NoQuarterState 和 HasQuarterState 分的父类,它抽象了这 4 个类的共有属性和行为。在使用中,无论是这 4 个类中哪个类的对象,都可被当作 State 对象来使用。 根据题目的描述,可以知道一个纸巾售卖机它由 4 种状态,分别是售出纸巾、纸巾售完、没有投币、有 2 元钱。 在本题中,根据程序不难知道第(1)空是要定义 5 个对象指针,而这些对象指针都应该属于 State 类型,因此第一空答案为 State。 第(2)在类 NoQuarterState(没有投币)的
12、insertQuarter 函数中,而这个函数是投币函数,在该函数中,使用了 tissueMachine 类的 setState 方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图,可以知道,从没有投币状态,经过投币后,应该转换到有 2 元钱状态。setState 方法的参数是一个 State 的对象,因此第(2)空应该是一个有 2 元钱对象,这里可以新创建一个该对象,也可以通过 tissueMachine 类的 getHasQuarterState 方法来获得这样一个对象,所以第(2)空答案应该是 tissueMachine-getHasQuarterState()或 n
13、ew HasQuarterState。 第(3)在类HasQuarterState(有 2 元钱)的 ejectQuarter 函数中,而这个函数是退币函数,在该函数中,也使用了tissueMachine 类的 setState 方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图,可以知道,从有 2 元钱状态,经过退币后,应该转换到没有投币状态。而 setState 方法的参数是一个 State 的对象,因此第(3)空应该是一个没有投币对象,而这里我们可以新创建一个该对象,也可以通过 tissueMachine 类的 getNoQuarterState 方法来获得这样一个对
14、象,所以第(3)空答案应该是“tissueMachine-getNoQuarterState()”或“new NoQuarterState”。 同样的道理,可以知道第(4)空的答案是 tissueMachine-getNoQuarterState()或 new NoQuarterState。第(5)空的答案是tissueMachine-getSoldOutState()或 new SoldOutState。三、B试题三/B(总题数:1,分数:15.00)3.某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表所示
15、。 咖啡及配料的种类和价格表咖 啡 价格/杯 配 料 价格/份蒸馏咖啡(Espresso) 25 摩卡(Mocha) 10深度烘焙咖啡(DarkRoast) 20 奶泡(Whip) 8现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图所示的类图。 (分数:15.00)_正确答案:(1)protected (2)virtual string getDescription (3)virtual int cost()=0 (4)Beverage*beverage (5)beverage (6)beverage)解析:解析 本题考查了 C+语言的应用能力和装饰设计模式的应用。 第(1
16、)空很明显,是要说明属性description 在类 Beverage 中的类型,应该是私有的、受保护的或公有的,从后面的程序可以看出,子类中继承使用了该属性,因此这里只能定义为受保护的,因此第(1)空的答案为 protected。 第(2)空处也很明显,是要给出一个函数的定义,并且该函数的函数体是“return description;”,从子类奶泡和摩卡中不难发现这个函数应该是 getDescription,因此本空的答案为 virtual string getDescription。 第(3)空需要结合后面各子类才能发现,在 Beverage 中还应该定义一个函数 cost,而这个函数在
17、Beverage 中并没有实现,因此要定义为纯虚函数,所以第(3)空的答案为 virtual int cost()=0。 第(4)空在类 CondimentDecorator 中,且是该类唯一的一条语句,而它的子类分别是奶泡和摩卡,在奶泡和摩卡这两个类中,都用到了 Beverage*beverage,而在使用之前并没有说明,因此这就可以说明,Beverage*beverage 是在父类 CondimentDecorator 中定义的,子类直接继承使用,因此第(4)空的答案为Beverage*beverage。 第(5)和第(6)空在主函数当中,其中第(5)空是要创建一个 Mocha 对象,应该
18、调用的是类 Mocha 的构造函数。从类 Mocha 中,可以看出,其构造函数 Mocha 的参数是一个 Beverage 类型的对象指针,而在主函数中,开始就定义了一个 Beverage 类型的对象指针 beverage,因此这里只需填写beverage 即可。同理第(6)空的答案也是 beverage。四、B试题四/B(总题数:1,分数:15.00)4.已知某类库开发商提供了一套类库,类库中定义了 Application 类和 Document 类,它们之间的关系如图所示。其中,Application 类表示应用程序自身,而 Document 类则表示应用程序打开的文档。Applicati
19、on 类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个 Document 对象表示了。 (分数:15.00)_正确答案:(1)Document (2)aDocument (3)!canOpenDocument(docName) (4)Document (5)doCreateDocument() (6)adoc.open(docName) (7)adoc.read(docName)解析:解析 本题考查了 Java 语言的应用能力和模板方法设计模式。空(1)考查了 Java 库中 Vector 模板类的使用,由于 Vector 模板类可以存储任意类型,在定
20、义时需要指定其存储类型,根据后面的代码,能够加入到该文档集合对象的类型为文档类型,因此空(1)处的类型应该为 Document。空(2)处将文档对象加入文档集合对象中。从空(3)开始的代码属于图中 Application 类的 OpenDocument 方法,该方法是模板方法,因此,需根据题目给出的步骤一一对应填空。空(3)处判断能否打开文档,需要调用父类自己的方法 canOpenDocument。空(4)与空(5)所在的语句需要创建文档对象,调用 doCreateDocument 方法,接着通过文档对象打开和读取文档,最后通过 addDocument 方法将该文档对象加入到文档对象集合中。所
21、有这些方法都是在父类或文档对象中进行定义,不涉及到具体的子类。而子类负责要实现这些模板方法中需要调用的方法以便运行时被调用。五、B试题五/B(总题数:1,分数:15.00)5.某大型商场内安装了多个简易的纸巾售卖机,自动出售 2 元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图 1 所示。图 1 纸巾售卖机状态图采用状态(State)模式来实现该纸巾售卖机,得到如图 2 所示的类图。其中,类 State 为抽象类,定义了投币、退币、出纸巾等方法接口。类 SoldState、SoldOutState、NoQuarterState 和 HasQuarterState 分别对应图 1 中
22、纸巾售卖机的 4 种状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。(分数:15.00)_正确答案:(1)State (2)tissueMachine.getHasQuarterState() (3)tissueMachine.getNoQuarterState() (4)tissueMachine.getNoQuarterState() (5)tissueMachine.getSoldOutState()解析:解析 本题考查基本面向对象设计模式的运用能力。 状态设计模式主要是能够使一个对象的内在状态改变时允许改变其行为,使这个对象看起来像是改变了其类。由类图可知类 State 是类Sold
23、State、SoldOutState、NoQuarterState 和 HasQuarterState 分的父类,它抽象了这 4 个类的共有属性和行为。在使用中,无论是这 4 个类中哪个类的对象,都可被当作 State 对象来使用。 根据题目的描述,可以知道一个纸巾售卖机它由 4 种状态,分别是售出纸巾、纸巾售完、没有投币、有 2 元钱。 在本题中,根据程序不难知道第(1)空是要定义 5 个对象的引用,而这些变量都应该属于 State 类型,因此第一空答案为 State。 第(2)在类 NoQuarterState(没有投币)的 insertQuarter()函数中,而这个函数是投币函数,在该
24、函数中,使用了 tissueMachine 类的 setState 方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图,可以知道,从没有投币状态,经过投币后,应该转换到有 2 元钱状态。setState 方法的参数是一个 State 的对象,因此第(2)空应该是一个有 2 元钱对象,这里可以新创建一个该对象,也可以通过 tissueMachine 类的 getHasQuarterState 方法来获得这样一个对象,所以第(2)空答案应该是 tissueMachine.getHasQuarterState()或 new HasQuarterState。 第(3)在类HasQu
25、arterState(有 2 元钱)的 ejectQuarter 函数中,而这个函数是退币函数,在该函数中,也使用了tissueMachine 类的 setState 方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图。可以知道,从有 2 元钱状态,经过退币后,应该转换到没有投币状态。setState 方法的参数是一个 State 的对象,因此第(3)空应该是一个没有投币对象,这里可以新创建一个该对象,也可以通过tissueMachine 类的 getNoQuarterState 方法来获得这样一个对象,所以第(3)空答案应该是tissueMachine.getNoQuar
26、terState()或 new NoQuarterState。 同样的道理,可以知道第(4)空的答案是tissueMachine.getNoQuarterState()或 newNoQuarterState。第(5)空的答案是tissueMachine.getSoldOutState()或 new SoldOutState。六、B试题六/B(总题数:1,分数:15.00)6.某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表所示。 咖啡及配料的种类和价格表咖啡价格/杯配料价格/份蒸馏咖啡(Espresso)25
27、摩卡(Mocha)10深度烘焙咖啡(DarkRoast)20奶泡(Whip)8现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图所示的类图。 (分数:15.00)_正确答案:(1)abstract (2)String getDescription (3)abstract int cost() (4)Beverage beverage (5)beverage (6)beverage)解析:解析 本题考查了 Java 语言的应用能力和装饰设计模式的应用。 第(1)空很明显,是要给类Beverage 前添加定义的关键字,从整个程序来看,应该要将类 Beverage 定义为抽象类,需
28、要在前面添加关键字 abstract,因此第(1)空的答案为 abstract。 第(2)空处也很明显,是要给出一个函数的定义,并且该函数的函数体是“return description;”,从子类奶泡和摩卡中我们不难发现这个函数应该是getDescription,而该函数的返回类型 String,因此本空的答案为 String getDescription。 第(3)空需要结合后面各子类才能发现,在 Beverage 中还应该定义一个函数 cost,而这个函数在 Beverage 中并没有实现,因此要定义为抽象函数,所以第(3)空的答案为 abstract int cost()=0。 第(4
29、)空在类CondimentDecorator 中,且是该类唯一的一条语句,而他的子类分别是奶泡和摩卡,在奶泡和摩卡这两个类中,都用到了 Beverage beverage,而在使用之前并没有说明,因此这就可以判定,Beverage beverage 是在父类 CondimentDecorator 中定义的,子类直接继承使用,因此第(4)空的答案为 Beverage beverage。 第(5)和第(6)空在主函数当中,其中第(5)空是要创建一个 Mocha 对象,应该调用的是类。Mocha 的构造函数。从类 Mocha 中,可以看出,其构造函数 Mocha 的参数是一个 Beverage 类型的对象引用,而在主函数中,开始就定义了一个 Beverage 类型的对象引用 beverage,因此这里只需填写 beverage即可。同理第(6)空的答案也是 beverage。