1、软件设计师-面向对象程序设计(一)及答案解析(总分:149.00,做题时间:90 分钟)阅读以下说明和 C+代码,将应填入 (n) 处的字句写在对应栏内。说明某绘图系统存在 Point、Line、Square 三种图元,它们具有 Shape 接口,图元的类图关系如图 18-1 所示。现要将 Circle 图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了 XCircle 类,且完全满足系统新增的 Circle 图元所需的功能,但 XCircle 不是由 Shape 派生而来的,它提供的接口不能被系统直接使用。代码 18.1 既使用了 XCircle 又遵循了 Shape 规定的接口,既
2、避免了从头开发一个新的 Circle类,又可以不修改绘图系统中已经定义的接口。代码 18.2 根据用户指定的参数生成特定的图元实例,并对之进行显示操作。绘图系统定义的接口与 XCircle 提供的显示接口及其功能如表 18-1 所示。(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读以下说明和 Java 代码,将应填入 (n) 处的字句写在对应栏内。说明某绘图系统存在 Point、Line、Square 三种图元,它们具有 Shape 接口,图元的类图关系如图 18-2 所示。现要将 Circle 图元加入此绘图系统以实现功能扩充。已知
3、某第三方库已经提供了 XCircle 类,且完全满足系统新增的 Circle 图元所需的功能,但 XCircle 不是由 Shape 派生而来的,它提供的接口不能被系统直接使用。代码 18.3 既使用了 XCircle 又遵循了 Shape 规定的接口,既避免了从头开发一个新的 Circle类,又可以不修改绘图系统中已经定义的接口。代码 18.4 根据用户指定的参数生成特定的图元实例,并对之进行显示操作。绘图系统定义的接口与 XCircle 提供的显示接口及其功能如表 18-2 所示。(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读以
4、下说明和 C+代码,将应填入 (n) 处的字句写在对应栏内。说明在一公文处理系统中,开发者定义了一个公文类 OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文类的内容或状态发生变化时,关联此 OfficeDoc 类对象的相应的 DocExplorer 对象都要更新其自身的状态。一个 OfficeDoc 对象能够关联一组 DocExplorer 对象。当 OfficeDoc 对象的内容或状态发生变化时,所有与之相关联的 DocExplorer 对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个 C+源文件中,能够正确编译通过。C+代码#includeiostrea
5、mconst OBS_MAXNUM=20/最多与 OfficeDoc 对象相关联的 DocExplorer 对象个数(1) ;class DocExplorer /关注 OfficeDoc 公文对象的类public:DocExplorer( (2) *doc); /构造函数(3) void update(OfficeDoc *doc)=0; /更新自身状态的函数/其他相关属性和方法省略class OfficeDoc/公文类private:DocExplorer *myObsOBS_MAXNUM;/关注此公文类的 DocExplorer 类对象指针数组int index;/与 OfficeDoc
6、 对象关联的 DocExplorer 对象的个数public:OffiCeDoc()index=0;void attach(DocExplorer *o)/将一 DocExplorer 对象与 OfficeDoc 对象相关联if(index=OBS_MAXNUM|o=NULL)return;for(int loop=0;loopindex;loop+)if(myOhs100p=o)return;myObsindex=o;index+;void detach(DocExplorer *o)/解除某 DocExplorer 对象与 OfficeDoc 对象的关联if(o=NULL)return;f
7、or(int loop=0;loopindex;loop+)if(myObs100p=o)if(loop=index-2)myObs100p=myObsindex-1;myObsindex-1=NULL;index-;break;private:void notifyObs()/通知所有的 DocExplorer 对象更改自身状态for(int loop=0;loopindex;loop+)myObsloop- (4) ;/DocExplorer 对象更新自身状态/其他公文类的相关属性和方法;DocExplorer:DocExplorer(OfficeDoc *doc)(/DocExplore
8、r 类对象的构造函数doc- (5) ; /将此 DocExplorer 对象与 doc 对象相关联(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读以下说明和 Java 代码,将应填入 (n) 处的字句写在对应栏内。说明在一公文处理系统中,开发者定义了一个公文类 OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文类的内容或状态发生变化时,关联此 OfficeDoc 类对象的相应的 DocExplorer 对象都要更新其自身的状态。一个 OfficeDoc 对象能够关联一组 DocExplorer 对象。当 OfficeDoc
9、对象的内容或状态发生变化时,所有与之相关联的 DocExplorer 对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个 Java 源文件中,能够正确编译通过。Java 代码/Subject.java 文件public interface Subjectpublic void attach(Observer DocExplorer);public void detach(Observer DocExplorer);void notifyObservers();/Observer.Java 文件public interface Obsever(void update( (1) );/O
10、fficeDoc.Java 文件import Java.util.*;public class OfficeDoc implements Subject/OfficeDoc 类实现 Subject 接口private Vector ObserverVector=new Java.util.Vector();/存储与 OfficeDoc 相关联的 DocExplorer 对象public void attach(Obsever observer)/将某 DocExplorer 对象与 OfficeDoc 相关联ObserverVector.addElement(observer);public
11、void detach(Observer observer)/解除某 DocExplorer 对象与 OfficeDoc 的关联关系ObsprverVector.removeElement(observer);public void notifyobserVers()/当 OfficeDoc 对象状态已发生变化时,通知所有的 DocExplorer 对象Enumeration enumeration= (2) ;while(enumeration.hasMoreElements()(Observer)enumeration.nextElement(). (3) ;public Enumerat
12、ion Observers()return ObserverVector.elements();/其他公文类的属性和方法省略/DocExplorer.java 文件public class DocExplorer implements (4) public void update( (5) )/更新 DocExplorer 自身的状态,代码省略(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读以下说明和 C 代码,将应填入 (n) 处的字句写在对应栏内。说明在一公文处理系统中,开发者定义了一个公文结构 OfficeDoc,其中定义了公文应该具有的属性
13、。当公文类的内容或状态发生变化时,与之相关联的 DocExplorer 结构的值都需要发生改变。一个 OfficeDoc 结构能够关联一组 DocExplorer 结构。当 OfficeDoc 结构的内容或状态发生变化时,所有与之相关联的DocExplorer 结构都将被更新,这种应用被称为观察者模式。以下代码采用 C 语言实现,能够正确编译通过。C 代码#includestdio.h#define OBS_MAXNUM 20/*一个 OfficeDoc 变量最多能够关联的 DocExplorer 变量的个数*/typedef void( (1) )(struc OfficeDoc *,str
14、uct DocExplorer *);Struet DocExplorerfunc update; /*DocExplorer 结构采用的更新函数*/*其他的结构字段省略*/;struct OffiCeDoc(2) myObsOBS_MAXNUM;/*存储所有与 OfficeDoc 相关联的 DocExplorer 结构指针*/int index;/*与 OfficeDoc 结构变量相关联的 DocExplorer 结构变量的个数*/;void attach(struct OfficeDoc *doc,struct DocExplorer *ob)/*关联 Obersver 结构 ob 与 O
15、fficeDoc 结构 doc*/int loop=0;if(doc-index=OBS_MAXNUM|ob=NULL)return;for(loop=0;loopdoc-index;loop+)if(doc-myObsloop=ob)return;doc-myObsdoc-index=ob;doc-index+;void detach(Struct OfficeDoc *doc,struct DocExplorer *ob)/*解除 doc 结构与 ob 结构间的关系*/int loop;if(ob=NULL)return;for(loop=0;loopdoc-index;loop+)if(
16、doc-myObsloop=ob)if(loop=doc-index-2)doc-myObsloop=doc-myObs (3) ;doc-myObsdoc-index-1=NULL;doc-index-;breack;void updatel(Struct OfficeDoc *doc,struct DocExplorer *ob)/*更新 ob 结构的值,更新代码省略*/void update2(struct OfficeDoc *doc,struct DocExplorer *ob)/*更新 ob 结构的值,更新代码省略*/void notifyObs(struct OfficeDoc
17、*doc)/*当 doc 结构的值发生变化时,通知与之关联的所有 DocExplorer 结构变量*/int loop;for(loop=0;loopdoc-index;loop+)(doc-myObsloop)-update( (4) );void msin()struct OfficeDoc doc; /*定义一个 OfficeDoc 变量*/struct DocExplorer explorer1,explorer2; /*定义两个 DocExplorer 变量*/*初始化与 OfficeDoc 变量相关的 DocExplorer 变量个数为 0*/doc.index=0;explore
18、r1.update=update1; /*设置 explorer1 变量的更新函数*/explorer2.update=update2; /*设置 explorer2 变量的更新函数*/attach(doc,explorer1);/关联 explorer1 与 doc 对象*/attach(doc,explorer2);/*关联 explorer2 与 doc 对象*/*其他代码省略*/(5) ;/*通知与 OfficeDoc 相关的所有 DocExplorer 变量*/return;(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读下列说明、图和
19、C+代码,将应填入 (n) 处的字句写在对应栏内。说明某订单管理系统的部分 UML 类图如图 18-3 所示。(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读下列说明、图及 Java 程序,将应填入 (n) 处的字句写在对应栏内。说明某订单管理系统的部分 UML 类图如图 18-4 所示。(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读以下说明和 C+代码,将应填入 (n) 处的字句写在对应栏内。说明传输门是传输系统中的重要装置。传输门具有 Open(打开)、Closed(已关闭)、Opening(正在
20、打开)、StayOpen(保持打开)、Closing(正在关闭)5 种状态。触发传输门状态转换的事件有 crick、complete 和timeout 三种。事件与其相应的状态转换如图 18-5 所示。(分数:14.98)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读以下说明及 Java 程序,将应填入 (n) 处的字句写在对应栏内。说明传输门是传输系统中的重要装置。传输门具有 Open(打开)、Closed(已关闭)、Opening(正在打开)、StayOpen(保持打开)、Closing(正在关闭)5 种状态。触发状态的转换事件有 c
21、rick、complete 和 timeout三种。事件与其相应的状态转换如图 18-6 所示。(分数:14.98)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读下列说明和 C+代码,将应填入 (n) 处的字句写在对应栏内。说明某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表 18-4 所示。表 18-4 鸭子各类及其特征鸭子种类 发声特征 飞行特征 外现特征灰鸭(MallardDuck)发出“嘎嘎”声(Quack)用翅膀飞行(FlyWithWin
22、gs) 灰色羽毛红头鸭(RedHeadDuck)发出“嘎嘎”声(Quack)用翅膀飞行(FlyWithWings)灰色羽毛、头部红色棉花鸭(CottonDuck) 不发声(QuackNoWay) 不能飞行(FlyNoWay) 白色橡皮鸭(RubberDuck)发出橡皮与空气摩擦声(Squeak) 不能飞行(FlyNoWay)黑色橡皮颜色为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图 18-7 所示。(分数:14.04)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_软件设计师
23、-面向对象程序设计(一)答案解析(总分:149.00,做题时间:90 分钟)阅读以下说明和 C+代码,将应填入 (n) 处的字句写在对应栏内。说明某绘图系统存在 Point、Line、Square 三种图元,它们具有 Shape 接口,图元的类图关系如图 18-1 所示。现要将 Circle 图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了 XCircle 类,且完全满足系统新增的 Circle 图元所需的功能,但 XCircle 不是由 Shape 派生而来的,它提供的接口不能被系统直接使用。代码 18.1 既使用了 XCircle 又遵循了 Shape 规定的接口,既避免了从头开
24、发一个新的 Circle类,又可以不修改绘图系统中已经定义的接口。代码 18.2 根据用户指定的参数生成特定的图元实例,并对之进行显示操作。绘图系统定义的接口与 XCircle 提供的显示接口及其功能如表 18-1 所示。(分数:15.00)填空项 1:_ (正确答案:Shape)解析:填空项 1:_ (正确答案:XCircle)解析:填空项 1:_ (正确答案:displayIt())解析:填空项 1:_ (正确答案:Shape*)解析:填空项 1:_ (正确答案:getShapeInstance(type))解析:填空项 1:_ (正确答案:delete s)解析:阅读以下说明和 Java
25、 代码,将应填入 (n) 处的字句写在对应栏内。说明某绘图系统存在 Point、Line、Square 三种图元,它们具有 Shape 接口,图元的类图关系如图 18-2 所示。现要将 Circle 图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了 XCircle 类,且完全满足系统新增的 Circle 图元所需的功能,但 XCircle 不是由 Shape 派生而来的,它提供的接口不能被系统直接使用。代码 18.3 既使用了 XCircle 又遵循了 Shape 规定的接口,既避免了从头开发一个新的 Circle类,又可以不修改绘图系统中已经定义的接口。代码 18.4 根据用户指定
26、的参数生成特定的图元实例,并对之进行显示操作。绘图系统定义的接口与 XCircle 提供的显示接口及其功能如表 18-2 所示。(分数:15.00)填空项 1:_ (正确答案:implements Shape)解析:填空项 1:_ (正确答案:XCircle)解析:填空项 1:_ (正确答案:XCircle())解析:填空项 1:_ (正确答案:displaylt())解析:填空项 1:_ (正确答案:Shape)解析:填空项 1:_ (正确答案:getShapeInstance(type))解析:阅读以下说明和 C+代码,将应填入 (n) 处的字句写在对应栏内。说明在一公文处理系统中,开发者
27、定义了一个公文类 OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文类的内容或状态发生变化时,关联此 OfficeDoc 类对象的相应的 DocExplorer 对象都要更新其自身的状态。一个 OfficeDoc 对象能够关联一组 DocExplorer 对象。当 OfficeDoc 对象的内容或状态发生变化时,所有与之相关联的 DocExplorer 对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个 C+源文件中,能够正确编译通过。C+代码#includeiostreamconst OBS_MAXNUM=20/最多与 OfficeDoc 对象相关联的 Doc
28、Explorer 对象个数(1) ;class DocExplorer /关注 OfficeDoc 公文对象的类public:DocExplorer( (2) *doc); /构造函数(3) void update(OfficeDoc *doc)=0; /更新自身状态的函数/其他相关属性和方法省略class OfficeDoc/公文类private:DocExplorer *myObsOBS_MAXNUM;/关注此公文类的 DocExplorer 类对象指针数组int index;/与 OfficeDoc 对象关联的 DocExplorer 对象的个数public:OffiCeDoc()ind
29、ex=0;void attach(DocExplorer *o)/将一 DocExplorer 对象与 OfficeDoc 对象相关联if(index=OBS_MAXNUM|o=NULL)return;for(int loop=0;loopindex;loop+)if(myOhs100p=o)return;myObsindex=o;index+;void detach(DocExplorer *o)/解除某 DocExplorer 对象与 OfficeDoc 对象的关联if(o=NULL)return;for(int loop=0;loopindex;loop+)if(myObs100p=o)
30、if(loop=index-2)myObs100p=myObsindex-1;myObsindex-1=NULL;index-;break;private:void notifyObs()/通知所有的 DocExplorer 对象更改自身状态for(int loop=0;loopindex;loop+)myObsloop- (4) ;/DocExplorer 对象更新自身状态/其他公文类的相关属性和方法;DocExplorer:DocExplorer(OfficeDoc *doc)(/DocExplorer 类对象的构造函数doc- (5) ; /将此 DocExplorer 对象与 doc
31、对象相关联(分数:15.00)填空项 1:_ (正确答案:class OfficeDoc)解析:填空项 1:_ (正确答案:OfficeDoc)解析:填空项 1:_ (正确答案:virtual)解析:填空项 1:_ (正确答案:update(this))解析:填空项 1:_ (正确答案:attach(this))解析:阅读以下说明和 Java 代码,将应填入 (n) 处的字句写在对应栏内。说明在一公文处理系统中,开发者定义了一个公文类 OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文类的内容或状态发生变化时,关联此 OfficeDoc 类对象的相应的 DocExplor
32、er 对象都要更新其自身的状态。一个 OfficeDoc 对象能够关联一组 DocExplorer 对象。当 OfficeDoc 对象的内容或状态发生变化时,所有与之相关联的 DocExplorer 对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个 Java 源文件中,能够正确编译通过。Java 代码/Subject.java 文件public interface Subjectpublic void attach(Observer DocExplorer);public void detach(Observer DocExplorer);void notifyObservers(
33、);/Observer.Java 文件public interface Obsever(void update( (1) );/OfficeDoc.Java 文件import Java.util.*;public class OfficeDoc implements Subject/OfficeDoc 类实现 Subject 接口private Vector ObserverVector=new Java.util.Vector();/存储与 OfficeDoc 相关联的 DocExplorer 对象public void attach(Obsever observer)/将某 DocExpl
34、orer 对象与 OfficeDoc 相关联ObserverVector.addElement(observer);public void detach(Observer observer)/解除某 DocExplorer 对象与 OfficeDoc 的关联关系ObsprverVector.removeElement(observer);public void notifyobserVers()/当 OfficeDoc 对象状态已发生变化时,通知所有的 DocExplorer 对象Enumeration enumeration= (2) ;while(enumeration.hasMoreEl
35、ements()(Observer)enumeration.nextElement(). (3) ;public Enumeration Observers()return ObserverVector.elements();/其他公文类的属性和方法省略/DocExplorer.java 文件public class DocExplorer implements (4) public void update( (5) )/更新 DocExplorer 自身的状态,代码省略(分数:15.00)填空项 1:_ (正确答案:Subject subject(注:第二个 subject 可用其他标识符替
36、换。))解析:填空项 1:_ (正确答案:Observers())解析:填空项 1:_ (正确答案:update(this))解析:填空项 1:_ (正确答案:Observer)解析:填空项 1:_ (正确答案:Subject subject(注:第二个 subject 可用其他标识符替换。))解析:阅读以下说明和 C 代码,将应填入 (n) 处的字句写在对应栏内。说明在一公文处理系统中,开发者定义了一个公文结构 OfficeDoc,其中定义了公文应该具有的属性。当公文类的内容或状态发生变化时,与之相关联的 DocExplorer 结构的值都需要发生改变。一个 OfficeDoc 结构能够关联
37、一组 DocExplorer 结构。当 OfficeDoc 结构的内容或状态发生变化时,所有与之相关联的DocExplorer 结构都将被更新,这种应用被称为观察者模式。以下代码采用 C 语言实现,能够正确编译通过。C 代码#includestdio.h#define OBS_MAXNUM 20/*一个 OfficeDoc 变量最多能够关联的 DocExplorer 变量的个数*/typedef void( (1) )(struc OfficeDoc *,struct DocExplorer *);Struet DocExplorerfunc update; /*DocExplorer 结构采
38、用的更新函数*/*其他的结构字段省略*/;struct OffiCeDoc(2) myObsOBS_MAXNUM;/*存储所有与 OfficeDoc 相关联的 DocExplorer 结构指针*/int index;/*与 OfficeDoc 结构变量相关联的 DocExplorer 结构变量的个数*/;void attach(struct OfficeDoc *doc,struct DocExplorer *ob)/*关联 Obersver 结构 ob 与 OfficeDoc 结构 doc*/int loop=0;if(doc-index=OBS_MAXNUM|ob=NULL)return;
39、for(loop=0;loopdoc-index;loop+)if(doc-myObsloop=ob)return;doc-myObsdoc-index=ob;doc-index+;void detach(Struct OfficeDoc *doc,struct DocExplorer *ob)/*解除 doc 结构与 ob 结构间的关系*/int loop;if(ob=NULL)return;for(loop=0;loopdoc-index;loop+)if(doc-myObsloop=ob)if(loop=doc-index-2)doc-myObsloop=doc-myObs (3) ;d
40、oc-myObsdoc-index-1=NULL;doc-index-;breack;void updatel(Struct OfficeDoc *doc,struct DocExplorer *ob)/*更新 ob 结构的值,更新代码省略*/void update2(struct OfficeDoc *doc,struct DocExplorer *ob)/*更新 ob 结构的值,更新代码省略*/void notifyObs(struct OfficeDoc *doc)/*当 doc 结构的值发生变化时,通知与之关联的所有 DocExplorer 结构变量*/int loop;for(loo
41、p=0;loopdoc-index;loop+)(doc-myObsloop)-update( (4) );void msin()struct OfficeDoc doc; /*定义一个 OfficeDoc 变量*/struct DocExplorer explorer1,explorer2; /*定义两个 DocExplorer 变量*/*初始化与 OfficeDoc 变量相关的 DocExplorer 变量个数为 0*/doc.index=0;explorer1.update=update1; /*设置 explorer1 变量的更新函数*/explorer2.update=update2
42、; /*设置 explorer2 变量的更新函数*/attach(doc,explorer1);/关联 explorer1 与 doc 对象*/attach(doc,explorer2);/*关联 explorer2 与 doc 对象*/*其他代码省略*/(5) ;/*通知与 OfficeDoc 相关的所有 DocExplorer 变量*/return;(分数:15.00)填空项 1:_ (正确答案:*func)解析:填空项 1:_ (正确答案:struct DocExplorer*)解析:填空项 1:_ (正确答案:doc-index-1,或其等价形式)解析:填空项 1:_ (正确答案:do
43、c,doc-myObsloop,或其等价形式)解析:填空项 1:_ (正确答案:notifyObs(doc))解析:阅读下列说明、图和 C+代码,将应填入 (n) 处的字句写在对应栏内。说明某订单管理系统的部分 UML 类图如图 18-3 所示。(分数:15.00)填空项 1:_ (正确答案:itemsk.getProductptr()-getProductId(),或其等价形式)解析:填空项 1:_ (正确答案:itemsk.getQuantity(),或其等价形式)解析:填空项 1:_ (正确答案:catalog.getProductByIndex(k))解析:填空项 1:_ (正确答案:it!=sales.End(),或 itsales.End())解析:填空项 1:_ (正确答案:it-getOrderedAmount,或其等价形式)解析:阅读下列说明、图及 Java 程序,将应填入 (n) 处的字句写在对应栏内。说明某订单管理系统的部分 UML 类图如图 18-4 所示。(分数:15.00)填空项 1:_ (正确答案:implements IterableOrder)解析:填空