软件设计师-面向对象技术(四) (总分152,考试时间90分钟)
一、综合知识试题
在UML类图中,类与类之间存在依赖(Dependency)、关联(Association)、聚合(Aggregation)、组合(Composition)和继承(Inheritance)五种关系,其中, (14) 关系表明类之间的相互联系最弱, (15) 关系表明类之间的相互联系最强,聚合(Aggregation)的标准UML图形表示是 (16) 。
1. A.依赖 B.聚合 C.组合 D.继承 2. A.依赖 B.聚合 C.组合 D.继承
(3) 是指把数据以及操作数据的相关方法组合在同一个单元中,使我们可以把类作为软件中的基本复用单元,提高其内聚度,降低其耦合度。面向对象中的 (4) 机制是对现实世界中遗传现象的模拟,通过该机制,基类的属性和方法被遗传给派生类。
3. A.封装 B.多态 C.继承 D.变异 4. A.封装 B.多态 C.继承 D.变异
5. ______是指在运行时把过程调用和响应调用所需要执行的代码加以结合。 A.绑定 B.静态绑定 C.动态绑定 D.继承
下列UML类图表示的是 (53) 设计模式。该设计模式中 (54) 。
6. A.备忘录(Memento) B.策略(Strategy) C.状态(State) D.观察者(Observer) 7.
A.一个Subj ect对象可对应多个Observer对象 B.Subject只能有一个ConcreteSubject子类 C.Observer只能有一个ConcreteObserver予类
D.一个Subject对象必须至少对应一个Observer对象
开一闭原则(Open-Closed Principle,OCP)是面向对象的可复用设计的基石。开一闭原则是指
一个软件实体应当对 (23) 开放,对 (24) 关闭;里氏代换原则(Liskov Substitution Principle,LSP)是指任何 (25) 可以出现的地方, (26) 一定可以出现。依赖倒转原则(Dependence Inversion Principle,DIP)就是要依赖于 (27) 而不依赖于 (28) ,或者说要针对接口编程,不要针对实现编程。
8. A.修改 B.扩展 C.分析 D.设计 9. A.修改 B.扩展 C.分析 D.设计
10. A.变量 B.常量 C.基类对象D.子类对象 11. A.变量 B.常量 C.基类对象D.子类对象 12. A.程序设计语言B.建模语言C.实现 D.抽象 13. A.程序设计语言B.建模语言C.实现 D.抽象
14. 在选择某种面向对象语言进行软件开发时,不需要着重考虑的因素是,该语言______。 A.将来是否能够占据市场主导地位 B.类库是否丰富
C.开发环境是否成熟 D.是否支持全局变量和全局函数的定义
面向对象分析与设计中的 (8) 是指一个模块在扩展性方面应该是开放的,而在更改性方面应该是封闭的;而 (9) 是指予类应当可以替换父类并出现在父类能够出现的任何地方。
15. A.开闭原则 B.替换原则 C.依赖原则 D.单一职责原则 16. A.开闭原则 B.替换原则 C.依赖原则 D.单一职责原则
(29) 是一种很强的“拥有”关系,“部分”和“整体”的生命周期通常一样。整体对象完全支配其组成部分,包括它们的创建和销毁等; (30) 同样表示“拥有”关系,但有时候“部分”对象可以在不同的“整体”对象之间共享,并且“部分”对象的生命周期也可以与“整体”对象不同,甚至“部分”对象可以脱离“整体”对象而单独存在。上述两种关系都是 (31) 关系的特殊种类。
17. A.聚合 B.组合 C.继承 D.关联 18. A.聚合 B.组合 C.继承 D.关联 19. A.聚合 B.组合 C.继承 D.关联
20. 以下关于类和对象的叙述中,错误的是______。 A.类是具有相同属性和服务的一组对象的集合 B.类是一个对象模板,用它仅可以产生一个对象 C.在客观世界中实际存在的是类的实例,即对象 D.类为属于该类的全部对象提供了统一的抽象描述
当不适合采用生成子类的方法对已有的类进行扩充时,可以采用 (61) 设计模式动态地给一个对象添加一些额外的职责;当应用程序由于使用大量的对象,造成很大的存储开销时,可以采用 (62) 设计模式运用共享技术来有效地支持大量细粒度的对象;当想使用一个已经存在的类,但其接口不符合需求时,可以采用 (63) 设计模式将该类的接口转换成我们
希望的接口。
21. A.命令(Command) B.适配器(Adapter) C.装饰(Decorate) D.享元(Flyweight) 22. A.命令(Command) B.适配器(Adapter) C.装饰(Decorate) D.享元(Flyweight) 23. A.命令(Command) B.适配器(Adapter) C.装饰(Decorate) D.享元(Flyweight)
(46) 是把对象的属性和服务结合成一个独立的系统单元,并尽可能隐藏对象的内部细节; (47) 是指子类可以自动拥有父类的全部属性和服务; (48) 是对象发出的服务请求,一般包含提供服务的对象标识、服务标识、输入信息和应答信息等。
24. A.继承 B.多态 C.消息 D.封装 25. A.继承 B.多态 C.消息 D.封装 26. A.继承 B.多态 C.消息 D.封装
27. 以下关于面向对象方法中继承的叙述中,错误的是______。 A.继承是父类和予类之间共享数据和方法的机制 B.继承定义了一种类与类之间的关系
C.继承关系中的子类将拥有父类的全部属性和方法
D.继承仅仅允许单重继承,即不允许一个子类有多个父类
在面向对象分析与设计中, (56) 是应用领域中的核心类,一般用于保存系统中的信息以及提供针对这些信息的相关处理行为; (57) 是系统内对象和系统外参与者的联系媒介; (58) 主要是协调上述两种类对象之间的交互。
28. A.控制类 B.边界类 C.实体类 D.软件类 29. A.控制类 B.边界类 C.实体类 D.软件类 30. A.控制类 B.边界类 C.实体类 D.软件类
下面的UML类图描绘的是 (32) 设计模式。关于该设计模式的叙述中,错误的是 (33) 。
31. A.桥接 B.策略 C.抽象工厂 D.观察者
32. A.该设计模式中的Observer需要维护至少一个Subject对象
B.该设计模式中的ConcreteObserver可以绕过Subject及其子类的封装 C.该设计模式中一个Subject对象需要维护多个Observer对象
D.该设计模式中Subject需要通知Observer对象其自身的状态变化
二、案例分析试题
33. 阅读下列说明和Java代码,在 (n) 处填入正确的字句。 [说明]
某公司的组织结构图如图10.6所示,现采用组合(Composition)设计模式来设计,得到如图10.7所示的类图。
其中Company为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。类ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门。类HRDepartment和FinanceDepartment分别表示人力资源部和财务部。
[Java代码]
import javA.util.*: (1) Company
protected String name;
public Company (String name)( (2) =name;
public abstract void Add(Company c);//增加子公司、办事处或部门
public abstract void Delete(Company c);//删除子公司、办事处或部门
class ConcreteteCompany extends Company
private List< (3) >children-new ArrayList< (4) >(); //存储子公司、办事处或部门
public ConcreteCompany (String name) super (name); public void Add(Company c) (5) .add(c);
public void Delete (Company c) (6) .remove (c);
class HRDepartment extends Company
public HRDepartment (String name) super (name); //其他代码省略
class FinanceDepartment extends Company
public FinanceDepartment (String name)( super (name); //其他代码省略
public class Test
public static void main(String[] args)
ConcreteCompany root=new ConcreteCompany(\"北京总公司\"); root.Add (new HRDepartment(\"总公司人力资源部\")); root.Add (new FinanceDepartment(\"总公司财务部\")); **p=new ConcreteCompany(\"上海分公司\");
comp.Add (new HRDepartment(\"上海分公司人力资源部\")); comp.Add (new FinanceDepartment(\"上海分公司财务部\")); (7) ;
**p1 =new ConcreteCompany(\"南京办事处\");
comp1.Add (new HRDepartment(\"南京办事处人力资源部\")); comp1.Add (new FinanceDepartment(\"南京办事处财务部\"); (8) ;//其他代码省略
34. 阅读下列说明和Java代码,在 (n) 处填入适当的字句。 [说明]
已知某企业欲开发一家用电器遥控系统,即用户使用一个遥控器即可控制某些家用电器的开与关。遥控器如图10.33所示。该遥控器共有4个按钮,编号分别是0至3,按钮0和2能够遥控打开电器1和电器2,按钮1和3则能遥控关闭电器1和电器2。由于遥控系统需要支持形式多样的电器,因此,该遥控系统的设计要求具有较高的扩展性。现假设需要控制客厅电视和卧室电灯,对该遥控系统进行设计所得类图如10.34所示。
图10.34中,类RomoteController的方法onPressButton(int button)表示当遥控器按键按下时调用的方法,参数为按键的编号;Command接口中on和off方法分别用于控制电器的开与关;Light中turnLight(int degree)方法用于调整电灯光的强弱,参数degree值为0时表示关灯,值为100时表示开灯并且将灯光亮度调整到最大;TV中setChannel(int channel)方法表示设置电视播放的频道,参数channel值为0时表示关闭电视,为l时表示开机并将频道切换为第1频道。
[Java代码]
class Light//电灯类
public void turnLight (int degree)
//调整灯光亮度,0表示关灯,100表示亮度最大 ;
class TV//电视机类
public void setChannel (int channel) //0表示关机,1表示开机并切换到1频道 ;
interface Command//抽象命令类 void on(); void off(); ;
class RemoteController//遥控器类
protected Command []commands=new Command [4];
//遥控器有4个按钮,按照编号分别对应4个Command对象 public void onPressButton(int button) //按钮被按下时执行命令对象中的命令 if (button%2==0)commands [button].on(); else commnands [button].off();
public void setComrnand(int button, **mand)
(1) =command;//设置每个按钮对应的命令对象 ;
class LightCommand implements Command//电灯命令类 protected Light light;//指向要控制的电灯对象 public void on()light.turnLight (100);; public void off()light. (2) ;;
public LightCommand(Light liaht) this.light=light;; ;
class TVCornmand implements Command//电视机命令类 protected TV tv;//指向要控制的电视机对象 public void on()tv. (3) ;;
public void off()tv.setChannel(0);;
public TVCommand (TV tv) this.tv=tv;; ;
public class rs
public static void main (String []args)
Light light=new Light();TV tv=new TV();//创建电灯和电视对象 LightCommand lightCommand=new LightCommand(light); TVCommand tvCommand=new TVCommand (tv);
RemoteController remoteController=new RemoteController();
//设置按钮和命令对象
remoteCont roller. setCommand(0, (4) );
…//此处省略设置按钮1、按钮2和按钮3的命令对象代码
本题中,应用命令模式能够有效让类 (5) 和类 (6) 、类 (7) 之间的耦合性降至最小。
35. 阅读下列说明和C++代码,在 (n) 处填入适当的字句。 [说明]
现欲构造一文件/目录树,采用组合(Composite)设计模式来设计,得到的类图如10.16所示。
#include <list>
#include <iostream> #include <string> using namespace std; class AbstractFile protected:
string name; //文件或目录名称 public:
void printName()cout<<name; //打印文件或目录名称
virtual void addChild (AbstractFile *file) =0; //给一个目录增加子目录 或文件
virtual void removeChild(AbstractFile *file) =0; //删除一个目录的子目 录或文件
virtual list<AbstractFile*> *getChildren() =0; //获得一个目录的子目录 或文件 ;
class file:public AbstractFile public:
File (string name) (1) =name;
void addChild (AbstractFile *file)return; void removeChild (AbstractFile *file)return; (2) getChildren()(return (3) ; ;
class Folder :public AbstractFile private:
list <AbstractFile*> childList: //存储子目录或文件 public:
Folder (string name) (4) =name;
void addChild(AbstractFile*file) childList .push_back(file); void rernoveChild (AbstractFile*file) childList. remove( file); list<AbstractFile*>*getChildren()(return (5) ; ;
void main()
//构造一个树型的文件/目录结构
AbstractFile *rootFolder=new Folder(\"c:\\\\ \"); **positeFolder=new Folder(\"composite\");
AbstractFile *windowsFolder=new Folder( \"windows\"); AbstractFile *file=new File(\"TestCompositejava\"); rootFolder->addChild( compositeFolder); rootFolder->addChild(windowsFolder); composit eFolder->addChild(file);
36. 阅读下列说明和图,回答问题。 [说明]
某网上药店允许顾客凭借医生开具的处方,通过网络在该药店购买处方上的药品。该网上药店的基本功能描述如下。
(1)注册。顾客在买药之前,必须先在网上药店注册。注册过程中需填写顾客资料以及付款方式(信用卡或者支付宝账户)。此外顾客必须与药店签订一份授权协议书,授权药店可以向其医生确认处方的真伪。
(2)登录。已经注册的顾客可以登录到网上药房购买药品。如果是没有注册的顾客,系统将拒绝其登录。
(3)录入及提交处方。登录成功后,顾客按照“处方录入界面”显示的信息,填写开具处方的医生的信息以及处方上的药品信息。填写完成后,提交该处方。
(4)验证处方。对于已经提交的处方(系统将其状态设置为“处方已提交”),其验证过程为: ①核实医生信息。如果医生信息不正确,该处方的状态被设置为“医生信息无效”,并取消这个处方的购买请求;如果医生信息是正确的,系统给该医生发送处方确认请求,并将处方状态修改为“审核中”。
②如果医生回复处方无效,系统取消处方,并将处方状态设置为“无效处方”。如果医生没有在7天内给出确认答复,系统也会取消处方,并将处方状态设置为“无法审核”。 ③如果医生在7天内给出了确认答复,该处方的状态被修改为“准许付款”。
系统取消所有未通过验证的处方,并自动发送一封电子邮件给顾客,通知顾客处方被取消以及取消的原因。
(5)对于通过验证的处方,系统自动计算药品的价格并邮寄药品给已经付款的顾客。 该网上药店采用面向对象方法开发,使用UML进行建模。系统的类图如图10.2所示。 [问题1]
根据说明中的描述,给出图10.2中缺少的C1~C5所对应的类名以及(1)~(6)处所对应的
多重度。
[问题2]
图10.3给出了“处方”的部分状态图。根据说明中的描述,给出图10.3中缺少的S1~S4所对应的状态名以及(7)~(10)处所对应的迁移(transition)名。
[问题3]
图10.2中的符号“”和“”在UML中分别示类和对象之间的哪两种关系?两者之间的区别是什么?
37. 阅读下列说明和图,回答问题。 [说明]
某运输公司决定为新的售票机开发车票销售的控制软件。图10.8给出了售票机的面板示意图以及相关的控制部件。
售票机相关部件的作用如下所述。
(1)目的地键盘用来输入行程目的地的代码(例如,200表示总站)。
(2)乘客可以通过车票键盘选择车票种类(单程票、多次往返票和坐席种类)。
(3)继续/取消键盘上的取消按钮用于取消购票过程,继续按钮允许乘客连续购买多张票。 (4)显示屏显示所有的系统输出和用户提示信息。
(5)插卡口接受MCard(现金卡),硬币口和纸币槽接受现金。 (6)打印机用于输出车票。
假设乘客总是支付恰好需要的金额而无需找零,售票机的维护工作(取回现金、放入空白车票等)由服务技术人员完成。
系统采用面向对象方法开发,使用UML进行建模。系统的顶层用例图和类图分别如图10.9和图10.10所示。 [问题1]
根据说明中的描述,给出图10.9中A1和A2所对应的参与者,U1所对应的用例,以及(1)、(2)处所对应的关系。 [问题2]
根据说明中的描述,给出图10.10中缺少的C1~C4所对应的类名以及(3)~(6)处所对应的多重度。 [问题3]
图10.10中的类图设计采用了中介者(Mediator)设计模式,请说明该模式的内涵。
38. 阅读下列说明和Java代码,将应填入 (n) 处的字句写在对应栏内。 [说明]
某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表10.5所示。 表10.5飞机种类的特性
飞机种类 起飞特征 飞行特征
直升机(Helicopter) 垂直起飞(VerticalTakeOff) 亚音速飞行(SubSonicFly) 客机(AirPlane) 长距离起飞(LongDistanceTakeOff) 亚音速飞行(SubSonicFly) 歼击机(Fighter) 长距离起飞(LongDistanceTakeOff) 超音速飞行(SuperSonicFly) 鹞式战斗机(Harrier) 垂直起飞(VerticaITakeOff) 超音速飞行(SuperSonicFly)
为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计的类图如图10.12示。
图10.12中,AirCraft为抽象类,描述了抽象的飞机,而类Helicopter、AirPlane、Fighter和Harrier分别描述具体的飞机种类,方法fly()和takeOff()分别表示不同飞机都具有飞行特征和起飞特征类FlyBehavior与TakeOffBehavior为抽象类,分别用于表示抽象的飞行为与起飞行为;类SubSonicFly与SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff与LongDistanceTakeOff分别描述垂直起飞与长距离起飞的行为。 [Java代码]
interface FlyBehavior public void fly(); ;
class SubSonicFly implements FlyBehavior
public void fly()(System.out.println(\"亚音速飞行!\"); ;
class SuperSonicFly implements FlyBehavior
public void fly()(System.out.println(\"超音速飞行!\");
;
interface TakeOffBehavior public void takeOff(); ;
class VerticalTakeOff implements TakeOffBehavior
public void takeOff()(System.out.println(\"垂直起飞!\"); ;
class LongDistanceTakeOff implements TakeOffBehavior public void takeOff()System.out.println(\"长距离起飞!\"); ;
abstract class AirCraft protected (1) ; protected (2) ;
public void fly()( (3) ;) public void takeOff() (4) ; ;
class Helicopter (5) AirCraft public Helicopter ()
flyBehavior=new (6) ; takeOffBehavior=new (7) ; ;
//其他代码省略
39. 阅读下列说明和C++代码,在 (n) 处填入正确的字句。 [说明]
某公司的组织结构图如图10.4所示,现采用组合(Composition)设计模式来构造该公司的组织结构,得到如图10.5所示的类图。
其中Company为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。类ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门。类HRDepartment和FinanceDepartment分别表示人力资源部和财务部。
[C++代码]
#include <iostream> #include <list> #include <string> using namespace std; class Company//抽象类 protected: string name; public:
Company(string name) (1) =name; (2) ;//增加子公司、办事处或部门 (3) ;//删除子公司、办事处或部门 ;
class ConcreteCompany: public Company private:
list< (4) >children;//存储子公司、办事处或部门 public:
ConcreteCompany(string name):Company (name) void Add (Company*c) (5) .push back (c); void Delete (Company*c) (6) .remove (c); ;
class HRDepartment: public Company public:
HRDepartment(string name):Company(name)//其他代码省略 ;
class FinanceDepartment: public Company public:
FinanceDepartment(string name):Company(name)//其他代码省略 ;
void main()
ConcreteCompany *root=new ComcreteCompany(\"北京总公司\"); root->Add (new HRDepartrnent(\"总公司人力资源音\")); root->Add(new FinanceDepartment(\"总公司财务部\"));
ConcreteCompany *comp=new ConcreteCompany(\"上海分公司\"); comp->Add (new HRDepartment(\"上海分公司人力资源部\")); comp->Add(new FinanceDepartment(\"上海分公司财务部\")); (7) ;
ConcreteCompany *compl=new ConcreteCompany(\"南京办事处\");
comp 1->Add (new HRDepartment(\"南京办事处人力资源部\")); comp 1->Add (new FinanceDepartment(\"南京办事处财务部\")); (8) ;//其他代码省略
40. 阅读下列说明和图,回答问题。 [说明]
在线会议审稿系统(ORS:Online Reviewing System)主要处理会议前期的投稿和审稿事务,其功能描述如下。
(1)用户在初始使用系统时,必须在系统中注册(register)成为作者或审稿人。
(2)作者登录(login)后提交稿件和浏览稿件审阅结果。提交稿件必须在规定提交时间范围内,其过程为先输入标题和摘要、选择稿件所属主题类型、选择稿件所在位置(存储位置)。上述几步若未完成,则重复;若完成,则上传稿件至数据库中,系统发送通知。
(3)审稿人登录后可设置兴趣领域、审阅稿件给出意见以及罗列录用和(或)拒绝的稿件。 (4)会议委员会主席是一个特殊审稿人,可以浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程。其中关闭审稿过程须包括罗列录用和(或)拒绝的稿件。
系统采用面向对象方法开发,使用UML进行建模,在建模用例图时,常用的方式是先识别参与者,然后确定参与者如何使用系统来确定用例,每个用例可以构造一个活动图。参与者名称、用例和活动名称分别参见表10.7、表10.8和表10.9。系统的部分用例图和提交稿件的活动图分别如图10.23和图10.24所示。 表10.7 参与者列表
名称 说明 名称 说明 User 用户 Author 作者
Reviewer 审稿人 PCChair 委员会主席 表10.8用例名称列表
名称 说明 名称 说明 login 登录系统 register 注册 submit paper 提交稿件 browse review results 浏览稿件审阅结果
close reviewing process 关闭审稿过程 assign paper to review 分配稿件给审稿人
set preferences 设定兴趣领域 enter review 审阅稿件给出意见 list accepted/rejected paper 罗列录用或/和拒 绝的稿件 browse submitted papers 浏览提交的稿件
表10.9活动名称列表
名称 说明 名称 说明
select paper location 选择稿件位置 upload paper 上传稿件 select subject group 选择主题类型 send notification 发送通知 enter title and abstract 输入标题和摘要
[问题1]
根据说明中的描述,使用表10.7中的英文名称,绘出图10.22中A1~A4所对应的参与者。
[问题2]
根据说明中的描述,使用表10.8中的英文名称,给出图10.22中U1~U3所对应的用例。 [问题3]
根据说明中的描述,给出图10.22中(1)和(2)所对应的关系。 [问题4]
根据说明中的描述,使用表10.8和表10.9中的英文名称,给出图10.23中Action1~Action4对应的活动。
因篇幅问题不能全部显示,请点此查看更多更全内容