青岛理工大学软件设计与体系结构期末复习题及参考答案_第1页
青岛理工大学软件设计与体系结构期末复习题及参考答案_第2页
青岛理工大学软件设计与体系结构期末复习题及参考答案_第3页
青岛理工大学软件设计与体系结构期末复习题及参考答案_第4页
青岛理工大学软件设计与体系结构期末复习题及参考答案_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、 选择题1、 关于微软的三层架构,下列说法错误的是:A、分层的目的是为了实现“高内聚、低耦合”;B、采用“分而治之”的思想,把任务划分成子任务;C、唯一的缺陷是降低了代码的可复用性;D、易于控制,易于延展,易于多人进行项目合作。2、关于用户故事,下列说法不恰当的是:A、用户故事就是正在进行的关于需求谈话的助记符;B、是一个计划工具;C、用户故事分解需求,一个用户故事就是一个小的需求模块;D、“点数”能精确其实现代价。3、关于测试驱动开发,下述各项正确的是:A、编写所有产品代码的目的都是为了使失败的单元测试能够通过;B、编写完代码后必须马上编写单元测试C、能够促使模块之间加强耦合;D、防止模块之间隔离。4、关于计划游戏,下述说法不恰当的是:A、计划游戏的本质是划分业务人员和开发人员之间的职责;B、开发人员决定选择哪些用户故事C、开发人员基于上次迭代,为客户提供一个“预算”;D、跟踪速度是最为重要的管理手段之一。5、关于简单设计,下列说法错误的是:A、用最简单的办法实现每个小需求,前提是按照这些简单设计开发出来的软件必须通过测试。B、设计只要能满足系统和客户在当下的需求就可以了,不需要任何画蛇添足的设计,而且所有这些设计都将在后续的开发过程中被不断地重整和优化。C、对于设计结构必须足够简单/灵活,适应未来需求变化;D、绝不能容忍重复的代码。6、关于软件重构,下列说法不恰当的是:A、重构是在不改变代码外在行为的前提下对代码做出修改,以改进代码的内部结构的过程。B、每个改造都是微不足道的,但是这些所有的改造迭加在一起,就形成了对系统设计和架构显著的改进。C、每次重构进行完后,必须运行单元测试;D、重构耗时费力,不宜频繁进行。7、关于软件设计臭味,下列说法错误的是:A、僵化性是指软件运行性能很差;B、如果设计中包含有当前没有用的组成部分,它就包含不必要的复杂性;C、晦涩性是指模块难以理解;D、不能因为设计的退化去责怪需求的变化。8、关于依赖倒置原则,下列说法不恰当的是:A、高层模块不应该依赖于低层模块,二者都应该依赖于抽象;B、抽象应该依赖于细节;C、要针对接口编程,不要针对实现编程;D、任何变量都不应该指向具体类。9、关于迪米特法则,下列说法错误的是:A、一个对象应当对其他对象有尽可能少的了解;B、每一个软件单位对其它的单位都只有最少的知识,而且仅局限于那些与本单位密切相关的软件单位。C、迪米特法则的核心观念就是类间解耦,虽然解耦会部分降低类的复用性,但是可以很好的避免僵化性;D、陌生的类最好不要作为局部变量的形式出现在类的内部。10、关于职责链模式,下列说法不正确的是:A、职责链可以是一条直线、一个环或者一个树形结构;B、避免将一个请求的发送者与接收者耦合在一起C、不纯的职责链:一个具体处理者对象只能在两个行为中选择一个--要么承担全部责任,要么将责任推给下家;职责链模式给对象职责的分配带来更多的灵活性。11、为了能成功地实施XP,XP制定的四个准则不包括:A、文档B、简单C、反馈D、勇气12、关于用户故事,下列说法正确的是:A、用户故事就是正在开发的项目的脚本;B、是一个可行性分析工具;C、用户故事分解需求,一个用户故事就是一个小的需求模块;D、“点数”能精确其实现代价。13、关于代码重构,下面的叙述错误的是:A、不断修改的代码往往会退化/腐化,导致难于维护,因此需要重构。B、每个改造都是微不足道的,但是这些所有的改造迭加在一起,就形成了对系统设计和架构显著的改进。C、每次重构进行完后,必须运行单元测试,保证重构没有造成任何破坏,然后再去做下一次重构。D、重构是对代码结构的全面优化,每次改动往往较大,耗费也较大,因此重构频率不宜过于频繁。14、关于工厂方法模式,下述观点中不合适的是:A、是创建型模式的一种B、核心的工厂类不负责创建对象C、具体工厂类包含业务逻辑D、工厂类与产品类往往具有平行的等级结构15、关于职责链模式,下列说法不正确的是:A、职责链可以是一条直线、一个环或者一个树形结构;B、避免将一个请求的发送者与接收者耦合在一起C、不纯的职责链:一个具体处理者对象只能在两个行为中选择一个--要么承担全部责任,要么将责任推给下家;D、职责链模式给对象职责的分配带来更多的灵活性。16、微软推荐的三层架构不包括()A、业务逻辑层B、实体-联系层C、数据访问层D、表示层(界面层)17、为了能成功地实施XP,XP制定的四个准则不包括:()A、文档B、简单C、反馈D、勇气18、在XP项目中,关于代码重构,下面的叙述错误的是:()A、不断修改的代码往往会退化/腐化,导致难于维护,因此需要重构。B、每个改造都是微不足道的,但是这些所有的改造迭加在一起,就形成了对系统设计和架构显著的改进。C、每次重构进行完后,必须运行单元测试,保证重构没有造成任何破坏,然后再去做下一次重构。D、重构是对代码结构的全面优化,每次改动往往较大,耗费也较大,因此重构频率不宜过于频繁。19、关于单一职责原则,下述叙述错误的是:()A、就一个类而言,应该仅有一个引起它变化的原因。B、过多职责耦合到一起后,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。C、简言之,就是加大类之间的耦合,减少类内部的内聚。D、软件设计真正要做的许多内容,就是发现职责并把那些职责互相分离。20、关于替代原则,下述叙述错误的是:()A、只有父类能完全替代子类才能保证抽象父类的复用和扩展。B、替代原则指导继承,是继承的基石。C、对于LSP的违反常常会导致以明显违反OCP。D、继承依赖的IS-A关系是就行为方式而言的。21、关于依赖倒置原则,下述叙述错误的是:()A、高层模块不应该依赖于低层模块,二者都应该依赖于抽象。B、抽象不应该依赖于细节,细节应该依赖于抽象。C、要针对接口编程,不要针对实现编程。D、高层模块实现了在低层模块中声明并被低层模块调用的接口。22、关于迪米特法则,下述说法中不恰当的是:()A、一个对象应当对其他对象有尽可能少的了解。B、只与你“直接的朋友们”通信。C、迪米特法则的核心观念就是类间解耦。D、应用符合迪米特法则后,类之间就是弱耦合,从而系统的不同模块之间的通信效率会相应的提高。23、关于工厂方法模式,下述观点中不合适的是:()A、是创建型模式的一种B、核心的工厂类不负责创建对象C、具体工厂类包含业务逻辑D、工厂类与产品类往往具有平行的等级结构24、关于原型模式,下述观点不正确的是:()A、利用.Net中的MemberwiseClone()可以实现浅表复制B、利用序列化和反序列化不能实现深度复制C、允许动态增加或减少产品类,增加新产品对整个结构没有影响D、扩展功能:可以带有原型管理器25、关于桥接模式,下述说法不正确的是:()A、将抽象部分与实现部分分离,使它们都可以独立地变化B、将一个事物中多个维度的变化分离C、Implementor的接口必须与Abstraction的接口相同D、使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系26、关于组合模式,下述说法不恰当的是:()A、组合模式中,数据之间的关系是典型的网状结构B、所有的节点可以采用一致的处理方法C、安全的组合模式中,实际上违反了接口独立原则D、透明的组合模式,在实际执行过程中,存在隐患。27、关于装饰模式,下述说法不恰当的是:()A、动态地给一个对象增加一些额外的职责B、比单纯地使用继承方式更为灵活C、Decorator和Component的关系,首先是继承关系,然后是组合关系D、装饰模式虽然产生的对象数量较少,但是会生成大量较小的类28、关于模板方法模式,下述叙述不恰当的是:()A、定义一个操作中的算法的骨架,而将一些步骤的实现延迟到子类中。B、强调使用组合替代继承C、将行为尽量移动到结构的高端D、反向控制结构(IoC)是模版方法模式的典型应用29、关于命令模式,下述说法不正确的是:()A、解决了“行为请求者”与“行为实现者”之间的紧耦合B、将一些行为命令化,参数化C、可以实现Undo和RedoD、可能造成命令执行者对象过多是该模式的主要缺点30、关于观察者模式,下述说法不恰当的是:()A、解决的是对象间的一种多对多的依赖关系B、既要保证对象间的低耦合,又能够维持行动的协调一致,保证高度的协作C、很好的体现了依赖倒置原则D、在C#的实现方式中,委托定义可以充当抽象的Observer接口二、判断题1.建造者模式要求复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。()2.代理模式中,当代理对象将客户端请求发送给真实对象之前或之后往往会添加一些额外的操作。()3.在享元模式中,外部状态可以共享,但是内部状态不能共享。()4.外观模式定义了一个高层接口,这个接口使得复杂子系统更加容易使用。()5.观察者模式中,如果在被观察者之间有循环依赖,可能导致“死锁”。()6.软件体系结构设计的一个核心问题是“复用”。()7.实体类实现所谓的对象关系映射(简称ORM),是为了解决面向对象的类与关系数据库的表之间,存在的不匹配的现象。()8.合适的工具对成功来说是重要的,敏捷方法建议选用综合功能比较全面的工具。()9.极限编程要求每2周发布一次软件,称为一次发布周期。()10.用户故事的验收测试是在就要实现该用户故事之前或实现该用户故事的同时进行编写的。()11.放置钓钩(hook)以适应将来的软件需求变化,是开放-封闭原则的典型应用。()12.继承依赖的IS-A关系是就具体的行为方式而言的。()13.在设计类结构时,组合优于继承。()14.设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。()15.简单工厂模式完全符合开放-封闭原则。()16.在VS中,一个Project可以包含多个Solution。()17.敏捷开发认为:完备的文档是保证软件系统质量的重要手段。()18.XP项目实施过程中,每个人应该分工明确,各自签领自己擅长的任务。()19.在XP中,隐喻通常可以归结为一个名字系统。()20.在敏捷开发中,设计和构架的过程是持续不断的。()21.在代码中放置“Hook”是开放/封闭原则实施的主要手段。()22.ISP原则认为,接口应该尽可能简单,一个接口只做一件事情。()23.为减弱类间耦合,LoD提倡多使用序列化(Serialize)功能。()24.简单工厂模式违反开放/封闭原则,而工厂方法模式符合开放/封闭原则,且完全不需要判断工厂的类型。()25.相比适配器模式,桥接模式实际上是个“事后诸葛亮”。()三、简答题简述实体类的概念及其作用。敏捷开发宣言。简述XP的短交付周期的概念。测试驱动开发的概念及其积极作用。XP中简单设计的概念及其指导原则。简述常见的设计臭味。简述开放/封闭原则。简述什么是设计模式。试给出抽象工厂模式的结构图及其角色描述。10、简述观察者模式的定义与结构。11、软件体系结构的概念及构成。12、什么是结对编程?13、测试驱动开发遵循的3条简单的规则是什么?简述适配器模式的定义及对象适配器的结构。15、简述三层架构开发模式及其优点。16、每个软件模块都应该具有的三项职责是什么?17、为什么说“源代码就是设计!”?简述单一职责原则。简述依赖倒置原则。什么是面向对象的三大机制?21、简述简单工厂模式的优缺点。22、简述XP中的完整团队概念。四、设计题1、试给出多线程安全的“懒汉式”和“饿汉式”单件模式的代码。2、设计一个命令行状态下运行的运算程序,目前支持加减乘除(+,-,*,/)等四则运算,将来还可能添加求余数(%)运算,请以学过的设计模式设计一个程序结构,先画出类图,再写出代码。要求:(1)符合开放/封闭原则;(2)业务逻辑和界面逻辑必须分开;(3)先设计只支持四则运算的程序,再说明如何升级程序加上求余数(%)运算。3、银行帐户改动通知系统:帐户的余额发生变化时,需要通过手机短信和E-Mail的方式通知到用户本人,试用所学过的设计模式实现该系统。要求:(1)指出使用的设计模式的名称;(2)画出该设计模式的类结构图;(3)给出系统模拟实现的代码;(4)设计符合开放/封闭原则。4.最简单的手机(SimplePhone)在接收到来电的时候,会发出声音提醒主人,现在需要为该手机添加一项功能,即在接收到来电的时候,除了有声音还能产生震动(JarPhone),还可以得到更高级的手机(ComplexPhone),来电的时候,它不仅能够发声,产生震动,而且有灯光闪烁提示。试用学过的设计模式实现该系统。要求:给出设计模式的名称及系统结构的类图。5、什么是开放封闭原则?简要说明如何实现该原则。分别讨论三种工厂模式(简单工厂、工厂方法和抽象工厂)在不使用反射技术时,是否支持开放封闭原则。6、在某系统的图表处理模块中,需要将图表(Chart)显示和图表数据采集(DataCollection)分离,系统可支持多种图表(如柱状图BarChart,饼状图PieChart等),也提供了多种数据采集方式,例如可以从文本文件中读取数据(TxtDataCollection),也可以从数据库中读取数据(DBDataCollection),还可以从Excel文件中获取数据(ExcelDataCollection),如果需要从Excel文件中获取数据,则需要调用与Excel相关的API,例如读取Excel文件的ExcelReader类,而这个API是现有系统所不具备的。试用学过的2种设计模式来实现该系统。要求:给出设计模式的名称及系统结构的类图。

一、选择题CDABCDABCCACDCCBADCADDCBCADBDA二、判断题√√X√√√√XX√X√√√XXXXX√√X√XXX三、简答题1、 简述实体类的概念及其作用。实体类实现所谓的对象关系映射(ObjectRelationalMapping,简称ORM),是为了解决面向对象的类与关系数据库的表之间,存在的不匹配的现象,通过使用描述对象和关系之间映射的元数据,在程序中的类对象,与关系数据库的表之间建立持久的关系,用于在程序中描述数据库表。本质上就是将数据从一种形式转换到另外一种形式。简单地说,就是描述一个业务实体的类。实体类对象是现实世界中实体对象在计算机中的表示,在层与层之间以及层内模块间进行数据传输。2、敏捷开发宣言。我们正在通过亲身实践以及帮助他人实践,揭示更好的软件开发方法,通过这项工作,我们认为:个体和交互胜过过程和工具可以工作的软件胜过面面俱到的文档客户合作胜过合同谈判响应变化胜过遵循计划虽然右项也有其价值,但我们认为左项更加重要。3、 简述XP的短交付周期的概念。迭代计划:XP项目每两周交付一次可以工作的软件。每两周的迭代都实现了利益相关者的一些需求,在每次迭代结束时,会给利益相关者演示迭代生成的系统,以得到他们的反馈。迭代是一次较小的交付,可能会被加入到产品中,也可能不会。每个周期(Iteration)开发的需求都是用户最需要的东西。发布计划:XP团队通常会创建一个计划来规划随后大约6次迭代的内容。一次发布通常需要2-3个月的工作。它表示了一次较大的交付,通常此次交付会被加入到产品中。发布计划不是一成不变的,客户可以随时改变计划的内容,他可以取消用户故事,编写新的用户故事,或者改变用户故事的优先级别。但是客户应该更改后面迭代的内容,尽量不要更改下一次迭代。4、 测试驱动开发的概念及其积极作用。编写所有产品代码的目的都是为了使失败的单元测试能够通过。首先编写一个单元测试,由于它要测试的功能还不存在,因此它会运行失败,然后,编写代码使测试通过。编写测试用例和代码之间的更迭速度是很快的,基本上在几分钟左右。积极的影响:(1)程序中的每一项功能都有测试来验证它的操作的正确性。(2)首先编写测试可以迫使我们使用不同的观察点---程序调用者的角度,可以设计出便于调用的软件(3)通过首先编写测试,可以迫使自己把程序设计为可测试的,迫使我们解除软件中的耦合(forceustodecouplethesoftware)(4)测试可以作为一种无价的文档形式,而且可以提供范例5、XP中简单设计的概念及其指导原则。XP团队使他们的设计尽可能地简单、具有表现力(expressive)。此外,他们仅仅关注于计划在本次迭代中要完成的用户故事。他们不会考虑那些未来的用户故事。XP要求用最简单的办法实现每个小需求,前提是按照这些简单设计开发出来的软件必须通过测试。这些设计只要能满足系统和客户在当下的需求就可以了,不需要任何画蛇添足的设计,而且所有这些设计都将在后续的开发过程中被不断地重整和优化。3条XP指导原则:(1)考虑能工作的最简单的事情尽量考虑最简单的方法实现当前的用户故事。(2)你不需要它将来会用到,现在不考虑,不得不用时再添加;(3)一次,并且只有一次极限编程者绝不能容忍重复的代码6、简述常见的设计臭味。僵化性是指难以对软件进行改动,即使简单的改动;脆弱性是指,在进行一个改动时,程序的许多地方就可能出现问题;牢固性是指,设计中包含了对其他系统有用的部分,但是要把这些部分从系统中分离出来所需要的努力和风险是巨大的;软件的粘滞性和环境的粘滞性:当那些可以保持系统设计的方法比那些拼凑手法更难应用的时候,就表明设计具有高的粘滞性,当开发环境迟钝、低效时,就会产生环境的粘滞性;如果设计中包含有当前没有用的组成部分,它就包含不必要的复杂性;不必要的重复,剪切和粘贴也许是有用的文本编辑操作,但是它们却是灾难性的代码编辑操作;晦涩性是指模块难以理解。7、 简述开放/封闭原则。开放-封闭原则:软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。(1)对于扩展是开放的--这意味着模块的行为是可扩展的。我们可以根据需求的变化来改变模块的功能(2)对于修改是封闭的--对模块行为进行扩展时,不必改动模块的源代码或二进制代码(需要重新编译即为修改)把一个功能的通用部分和实现细节清晰的分离开来;通过派生来扩展功能。8、 简述什么是设计模式。每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。--经验性的好的方案面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。9、试给出抽象工厂模式的结构图及其角色描述。所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的(给出创建对象的几个方法的说明)。具体工厂(ConcreteFactory)角色:这个角色直接在客户端的调用下创建多个具体产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的(实现具体的创建方法)。抽象产品(AbstractProduct)角色:担任这个角色的类是工厂方法模式所创建的具体对象的父类,或它们共同拥有的接口—给出产品对象业务上的共同点。具体产品(ConcreteProduct)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。10、简述观察者模式的结构。定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。抽象主题(Subject)角色:抽象主题角色把所有对观察考对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现。抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。抽象观察者角色一般用一个抽象类或者一个接口实现。在这个示意性的实现中,更新接口只包含一个方法(即Update()方法),这个方法叫做更新方法。具体主题(ConcreteSubject)角色:将有关状态存入具体现察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者角色(ConcreteObservable)。具体主题角色通常用一个具体子类实现。具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体现察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体现察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。11、软件体系结构的概念及构成。答案:软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。处理构件负责对数据进行加工;数据构件是被加工的信息;连接构件把体系结构的不同部分组合连接起来。12、什么是结对编程?答案:所有产品(production)代码都是由结对的程序员使用同一台电脑共同完成的,结对人员中的一位控制键盘并输入代码,另一位观察输入的代码并寻找着代码中的错误和可以改进的地方。两人频繁互换角色,结对的关系每天至少改变一次,以便于每个程序员在一天中可以在两个不同的结对中工作,“业务领域专家”也需要与团队中的其他所有成员结对。13、测试驱动开发遵循的3条简单的规则是什么?答案:除非已经编写了一个不能通过的单元测试,否则不编写任何产品代码;只要编写能够正好导致测试不通过或者编译失败的单元测试就够了,无需再多;只要编写能够正好使失败的单元测试通过的产品代码就够了,无需再多。遵循上述原则,以非常短的周期(1-2分钟)迭代;14、简述适配器模式的定义及对象适配器的结构。答案:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。15、简述三层架构开发模式及其优点。微软推荐的三层结构通常是指数据访问层(DAL)、业务逻辑层(BLL)和表示层(UI)。与网络协议的分层一样,软件设计也要进行分层,分层的目的是为了实现“高内聚、低耦合”,采用“分而治之”的思想,把任务划分成子任务,逐个解决,易于控制,易于延展,易于多人进行项目合作。优点:不必为了业务逻辑上的微小变化而导至整个程序的修改,只需要修改商业逻辑层中的一个函数或一个过程—灵活,适应多变的需求;增强了代码的可重用性;便于不同层次的开发人员之间的合作,只要遵循一定的接口标准就可以进行并行开发了,最终只要将各个部分拼接到一起构成最终的应用程序。16、每个软件模块都应该具有的三项职责是什么?它运行起来所完成的功能,这也是该模块得以完成的原因。它要应对变化,几乎所有的模块在它们的生命周期中都要变化。开发者有责任保证这种改变应该尽可能地简单。它要和阅读它的人进行沟通。对该模块不熟悉的开发人员应该能够比较容易地阅读并理解它。17、为什么说“源代码就是设计!”?软件项目的设计是一个抽象的概念,它和程序的概观、结构以及每一个模块、类和方法的详情和结构有关,可以使用许多不同的媒介描绘设计,但是最终的体现为源代码。Reeves认为:软件系统的源代码是它的主要设计文档。用来描绘源代码的图示只是设计的附属物而不是设计本身。从根本上讲,源代码就是设计!18、简述单一职责原则。就一个类而言,应该仅有一个引起它变化的原因。在SRP中,我们把职责定义为“变化的原因”(areasonforchange)。软件设计真正要做的许多内容,就是发现职责并把那些职责互相分离(找到变化点,并封装之)。事实上,我们将要论述的其余原则都会以这样或那样的方式回到这个问题上。19、简述依赖倒置原则。高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。要针对接口编程,不要针对实现编程。20、什么是面向对象的三大机制?各种面向对象编程语言相互有别,但都能看到它们对面向对象三大机制的支持,即:“封装、继承、多态”封装,隐藏内部实现继承,复用现有代码,扩展已有的行为多态,改写已有的行为21、简述简单工厂模式的优缺点。优点:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。缺点:当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。违反开放/封闭原则:系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。22.简述XP中的完整团队概念。答案:客户、管理者和开发人员应该紧密地工作在一起,以便彼此知晓对方所面临的问题,并共同去解决这些问题。XP团队中的客户是指定义产品的特性并排列这些特性优先级的人或者团体。最好的情况是客户和开发人员在同一个房间中工作,次一点的情况是客户和开发人员之间的距离在100米内。如果确实无法和客户在一起工作,那么就去寻找能够在一起工作、愿意并能够代替真正客户的人。四、设计题1、试给出多线程安全的“懒汉式”和“饿汉式”单件模式的代码。publicclassSingleton//懒汉式{//唯一的实例对象,每次访问时重新读取instance变量的值privatestaticvolatileSingletoninstance=null;privatestaticreadonlyobjectlockHelper=newobject();//辅助加锁对象privateSingleton()//私有构造函数,防止外部应用使用new方法创建新的实例{}publicstaticSingletonGetInstance()//获取唯一的实例对象{if(instance==null)//先判断对象是否存在--这样做能够保证执行效率!{lock(lockHelper)//加锁--创建临界区{if(instance==null)//加锁后二次判断,只允许一个线程判断{instance=newSingleton();}}}returninstance;}}publicclassSingleton//饿汉式{//公共静态只读属性--依靠系统在加载时进行初始化,对于多线程环境也是安全的publicstaticreadonlySingletoninstance=newSingleton();privateSingleton()//私有构造函数,防止外部应用使用new方法创建新的实例{}}2、设计一个命令行状态下运行的运算程序,目前支持加减乘除(+,-,*,/)等四则运算,将来还可能添加求余数(%)运算,请以学过的设计模式设计一个程序结构,先画出类图,再写出代码。要求:(1)符合开放/封闭原则;(2)业务逻辑和界面逻辑必须分开;(3)先设计只支持四则运算的程序,再说明如何升级程序加上求余数(%)运算。类图:代码:Operation.cs:///<summary>///抽象的运算基类///</summary>publicclassOperation{//二个运算对象privatedouble_numberA;privatedouble_numberB;///<summary>///运算数A///</summary>publicdoubleNumberA{get{return_numberA;}set{_numberA=value;}}///<summary>///运算数B///</summary>publicdoubleNumberB{get{return_numberB;}set{_numberB=value;}}//获取运算结果,此处为虚方法,子类必须重写publicvirtualdoubleGetResult(){doubleresult=0;returnresult;}}OperationAdd.cs:///<summary>///加法类,派生自运算类,在GetResult方法中具体实现加法运算///</summary>publicclassOperationAdd:Operation{publicoverridedoubleGetResult()//实现具体的加法运算{doubleresult=0;result=NumberA+NumberB;returnresult;}}与上面的OperationAdd类似有OperationSub、OperationMul和OperationDivOperationFactory.cs:///<summary>///运算对象工厂类///</summary>publicclassOperationFactory{publicstaticOperationCreateOperate(stringoperate)//根据传进来的运算符来决定创建什么样的对象{return(Operation)Assembly.Load("程序集名称").CreateInstance(转换运算符为类名称(operate));}}主程序:classProgram{staticvoidMain(string[]args){try{//输入运算对象和运算符Console.Write("请输入数字A:");stringstrNumberA=Console.ReadLine();Console.Write("请输入运算符(+,-,*,/,%):");stringstrOperate=Console.ReadLine();Console.Write("请输入数字B:");stringstrNumberB=Console.ReadLine();//由工厂创建运算对象Operationoperate=OperationFactory.CreateOperate(strOperate);//设置要运算的数据operate.NumberA=Convert.ToDouble(strNumberA);operate.NumberB=Convert.ToDouble(strNumberB);//具体作运算--动态决定调用哪个子类的GetResult()方法doubleresult=operate.GetResult();//显示运算结果Console.WriteLine(strNumberA+strOperate+strNumberB+"="+result);Console.ReadLine();}catch(Exceptionex){Console.WriteLine("您输入的数据有错误!"+ex.ToString());Console.ReadLine();}}}扩展程序功能:仿照前面的OperationAdd添加支持新运算的类OperationMod,对运算符(%)转换为类名OperationMod作设置改变,重新编译系统即可。3、银行帐户改动通知系统:帐户的余额发生变化时,需要通过手机短信和E-Mail的方式通知到用户本人,试用所学过的设计模式实现该系统。要求:(1)指出使用的设计模式的名称;(2)画出该设计模式的类结构图;(3)给出系统模拟实现的代码;(4)设计符合开放/封闭原则。答案:使用观察者模式。代码:///<summary>///Observer--抽象观察者接口///</summary>publicinterfaceAccountUpdated{///<summary>///观察者接收/处理通知的方法///</summary>///<paramname="val">帐户余额</param>voidBalanceUpdated(doubleval);}///<summary>///具体观察者--帐户余额发生变化时,发送Email通知用户///</summary>classEmail:AccountUpdated{///<summary>///接收邮件通知的E-Mail地址///</summary>privatestringEmailAddress;publicEmail(stringaddress){EmailAddress=address;}///<summary>///发送Email通知操作///</summary>///<paramname="val">余额数值</param>publicvoidBalanceUpdated(doubleval){Console.WriteLine("发送邮件到{0},余额为{1}.",EmailAddress,val);}//其他操作相关的属性和方法}///<summary>///具体观察者--帐户余额发生变化时,通过手机发送短信通知用户///</summary>classMobile:AccountUpdated{///<summary>///接收短信通知的电话号码///</summary>privatestringPhoneNumber;publicMobile(stringphone){PhoneNumber=phone;}///<summary>///发送短信通知///</summary>///<paramname="val">余额数值</param>publicvoidBalanceUpdated(doubleval){Console.WriteLine("发送短信至手机{0},余额为{1}.",PhoneNumber,val);}//其他操作相关的属性和方法}///<summary>///ConcreteSubject具体主题--银行帐户///</summary>classBankAccount:Subject{///<summary>///帐户余额--subjectState///</summary>privatedoublebalance=0;///<summary>///存入/取出--调整余额

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论