您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 吉林大学2012级软件设计模式试题
第1页共4页2014-2015学年第1学期2012级《软件设计模式》考试试题(开卷)考试时间:2014年班级学号姓名本试卷满分100分;请将答案写在答题纸上,写明题号,不必抄题,字迹工整、清晰;试题中使用C++语言作为描述语言,答题时可以使用C++或Java或C#程序设计语言中的任意一种作为描述语言,但整个卷面只能使用其中一种,不得混合使用;请在答题纸和试题纸上都写上你的班级,学号和姓名,交卷时请将试题纸、答题纸和草纸一并交上来。一、单选题(共20分,每题2分)1.类设计中,“变化是绝对的,稳定是相对的”,下列哪个不属于这句话中“变化”的范畴?(A)改变函数参数的类型(B)增加新的数据成员(C)改变编程语言(D)改变对象交互的过程和顺序2.Open-Close原则的含义是一个软件实体:(A)应当对扩展开放,对修改关闭(B)应当对修改开放,对扩展关闭(C)应当对继承开放,对修改关闭(D)以上都不对3.下列关于继承表述错误的是:(A)继承是一种通过扩展一个已有类的实现,从而获得新功能的复用方法(B)泛化类(超类)可以显式地捕获那些公共的属性和方法。特殊类(子类)则通过附加属性和方法来进行实现的扩展(C)破坏了封装性,因为这会将父类的实现细节暴露给子类(D)继承本质上是“白盒复用”,对父类的修改,不会影响到子类4.下列关于对象组合/聚合,说法错误的是:(A)容器类能通过被包含对象的接口来对其进行访问(B)属于黑盒复用,封装性好,因为被包含对象的内部细节对外是不可见(C)可以在运行时将被包含对象改变成同类型对象,从而改变容器类的行为效果,但没有改变容器类的接口(D)比继承关系更加灵活,代价是相比继承关系,增强了类间的耦合度5.用于分离接口和具体实现,使得接口和实现可独立变化的是:(A)适配器模式(B)桥接模式(C)命令模式(D)模板方法模式6.体现“集中管理多个对象间的交互过程和顺序”的是:(A)生成器模式(B)门面模式(C)策略模式(D)中介者模式第2页共4页7.限制类的实例对象只能有一个的是:.(A)原型方法模式(B)工厂方法模式(C)单件模式(D)生成器模式8.用于为一个对象添加更多功能而不使用子类的是:(A)桥接模式(B)适配器模式(C)合成(组合)模式(D)装饰器模式9.适配器设计模式可以用于:(A)将已有类的接口转换成和目标接口兼容(B)改进系统性能(C)将客户端代码数据转换成目标接口期望的合适的格式(D)使所有接口不兼容类可以一起工作10.关于原型方法模式的说法,错误的是:(A)便于在运行时刻更换原型对象;(B)各产品必须实现复制的方法,如Clone方法;(C)实现产品复制功能的难易程度,是应用该模式必须考虑的;(D)设计时,不能同时使用生成器模式和原型方法模式;二、(共20分,每题5分)阅读代码,按要求回答问题:classShape{public:virtual~Shape(){}virtualvoidDraw()const=0;};classRectangle:publicShape{public:virutal~Rectangle(){}virtualvoidDraw()const{coutDrawRectangle.endl;}};已有的椭圆类classEllipse{public:Ellipse(inta,intb):ra(a),rb(b){}boolX_Draw(){/*略*/}private:intra,intrb;//椭圆长短轴};classCircle:publicShape{public:virutal~Circle(){}virtualvoidDraw()const{coutDrawCircle.endl;}};1.考察Shape,Rectangle和Circle三个类。若Circle::Draw()的实现会有多种其它方法,又不想从Circle类派生新子类。请给出你的设计方案或示例代码。2.若Circle::Draw()的实现就是长短轴均为2的Ellipse::X_Draw(),请问你怎样设计。给出你的设计方案或示例代码。第3页共4页3.请使用装饰器模式给Draw添加新的功能。给出示例代码及相应的主函数。如扩展矩形Draw的输出为:StartDrawing…DrawRectangle.扩展圆形Draw的输出为:DrawCircle.DrawOver.4.若从Shape类再派生一个新的子类Picture,且Picture组合多个Shape对象,其中Picture的Draw就是依次绘制其组合的各个Shape。现假设一个Picture对象只包含一个Rectangle和一个Circle对象,请在3的基础上继续扩展,并编写主函数,使得主函数能够输出:StartDrawing…DrawRectangle.DrawCircle.DrawOver.请给出具体设计代码和主函数。三、(20分)现开发一个应届毕业生招聘软件,初步方案中的类图如下:(1)各公司招聘毕业生的流程是不一样的;(2)同一公司招聘不同毕业生(这里举例Boy,Girl)的流程也是不一样的;(3)已知不同毕业生的类别是稳定的。(如Boy和Girl)(4)以后可能增加新功能,如试用(Practise).(5)以后可能增加新的公司。1.(12分)请应用访问者模式重新给出设计方案或示例代码,使得你的新设计满足根据上述要求。2.(4分)请说明如果增加新的功能(如试用),1中的设计如何适应。请给出示例代码.3.(4分)请说明如果增加新的公司(如中兴公司),1中的设计如何适应。请给出示例代码.四、(40分,每题20分)应用设计模式,给出设计方案、示例代码。1.游戏中每个初始英雄带一样武器,占据一个城堡,拥有一件法器。武器、城堡、法器都有多种,现已预设了几类英雄,如海盗(火枪、岛城、行船术)、骑士(火枪、石城、骑马术)等。第4页共4页(1)未来一定会增加新武器、新城堡、新法器等。如武器中增加一种新武器:激光枪。(2)来一定会增加新的预设类英雄,如未来战士。(3)各类英雄的特征不完全相同,但可能会有重复。如海盗、骑士都使用火枪。最初的部分代码如下:classKnight:publicHero{public:Knight(){weapon=newRifle();castle=newStoneCastle();power=newHorseMagic();}};现希望分离英雄与具体特性(如武器、城堡、法器等)的创建。请选择适当的设计模式重新设计,实现设计者的愿望。简要说明你的设计方案,并给出示例代码。2.猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(1)要有联动性,老鼠和主人的行为是被动的;(2)考虑可扩展性,猫的叫声可能引起其他联动效应。请选择适当的设计模式描述上述场景,简要说明你的设计方案,并给出示例代码。全卷完
本文标题:吉林大学2012级软件设计模式试题
链接地址:https://www.777doc.com/doc-5975789 .html