设计模式试卷 下载本文

设计模式期中考试试题

一:单项选择(共20道,每道2分)

1、设计模式一般用来解决什么样的问题( ) A.同一问题的不同表相 B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 2、下列属于面向对象基本原则的是( ) A.继承 B.封装 C.里氏代换 D都不是

3、Open-Close原则的含义是一个软件实体( )

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 它属于GoF23种设计模式 B 它是最简单的设计模式之一 C 它是学习其他创建型模式的基础

D 它只需要记住一个简单的参数即可获得所需对象的实例 E 它类中的方法通常为静态方法

F 它返回的类都有一个公共的父类和公共的方法 10、对象适配器模式是( )原则的典型应用。 A.合成聚合复用原则 B.里式代换原则

C.依赖倒转原则 D.迪米特法则 D.以上表述全部错误。 11.对于依赖倒转的表述错误的是( )

A.依赖于抽象而不依赖于具体,也就是针对接口编程。

B.依赖倒转的接口并非语法意义上的接口,而是,一个类对其他对象进行调用时,所知道的方法集合。

C.从选项B的角度论述,一个对象可以有多个接口。

D.实现了同一接口的对象,可以在运行期间,顺利地进行替换。而且不必知道所示用的对象是那个实现类的实例。 E.此题没有正确答案。

12. 现有5个产品族,分布于3各不同的产品等级结构,只要指明一个产品所处的产品族以及它所在的等级结构,就可以唯一地确认这个产品。那么使用抽象工厂方法模式只需要提供

( )个具体工厂即可。

A 5 B 3 C 8 D 15 E 1 F 30 G 4 13.抽象工厂模式的优点有( )

A 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。 B 所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

C 应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。

D 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。 E 添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品

F 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦) 14. 对于建造一辆汽车,使用建造者模式中ConcreteBulider(具体建造者)需要做的是( ) A 提供汽车的各个部件的构造和装配方法 B 建造汽车 C 建造汽车部件并且组合成汽车 D 指挥汽车建造 E 定义抽象接口

15单例模式的最主要的思想是( )

A 构造方法私有化 B 使用默认构造方 C 构造方法静态化 D 类私有化 E 类不允许被继承 F 类的方法不允许被访问 16. 在笔记本电脑用电的例子中,属于适配器的是( )

A 充电器 B 插座 C 笔记本 D 笔记本电源插孔

17. 桥接模式将继承关系转换为( )关系,从而降低了类与类之间的耦合,减少了代码 编写量 A 关联 B 多态 C 实现 D 重构 E 抽象

18. 组合模式描述了如何将容器对象和叶子对象进行( )组合,使得用户在使用时无须对它们进行区分,可以一致地对待容器对象和叶子对象

A 递归 B 重构 C 并列 D 内置 E 关联

19. 面向对象设计原则首先都是( )的原则,遵循这些设计原则可以有效地提高系统的复用性,同时提高系统的可维护性。

A 重载 B 复用 C 面向对象 D 封装 E 继承 F 多态 G抽象

20. 结构型模式分为类模式和对象模式,以下可以是类模式的是( )

A 适配器模式 B 桥接模式 C 组合模式 D 装饰模式 E 外观模式 F 享元模式 G 代理模式

二:多项选择题(共10道,每道3分)

1.以下说法错误的有( )

A 对于面向对象的软件系统设计来说,在支持可维护性的同时,需要提高系统的可复用性。 B 迪米特法则要求一个软件实体应当尽可能多的与其他实体发生相互作用。

C 单一职责原则要求在软件系统中,一个类只负责一个功能领域中的相应职责。 D 开闭原则要求一个软件实体应当对扩展开放,对修改关闭,但是为了增强系统功能,可

以随便的修改源代码。 E 里氏代换原则可以通俗表述为在软件中如果能够使用基类对象,那么一定能够使用其子

类对象。

F 依赖倒转原则要求抽象不应该依赖于细节,细节应该依赖于抽象;要针对接口编程,不

要针对实现编程。

G 接口隔离原则要求客户端不应该依赖那些它不需要的接口,即将一些大的接口细化成一

些小的接口供客户端使用。

H 合成复用原则要求复用时尽量使用继承,而不使用对象组合。

2. 设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式,其中的关键元素包括以下四个方面( )

A 模式名称 B 问题 C 目的 D 解决方案 E 效果 F 实例代码 G 相关设计模式 3. 简单工厂模式包含三个角色是( )

A 工厂角色 B 抽象产品口 C 具体产品角色 D 抽象接口角色 E 生产者角色 F 用户角色 G 使用者角色 4.工厂方法模式与简单工厂模式相比的优点有( ) A 工厂方法模式很好的符合开闭原则

B 工厂方法类模式中工厂类职责变轻,业务逻辑相对简单 C 具体产品与工厂类之间的耦合降低

D工厂方法模式是简单工厂模式的进一步抽象和推广 E Factory类内的方法常使用静态方法 F 只提供一个工厂类

G不需要考虑对象的具体创建细节

闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦) 5. 建造者模式的优点有哪些( ) A分步骤构建一个复杂的对象

B应对“复杂对象各个部分”的频繁需求变动

C用户使用不同的具体建造者即可得到不同的产品对象

D如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大

E如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制

6.对于原型模式的优点有( )

A当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过一个已有实例可以提高新实例的创建效率。 B 可以动态增加或减少产品类。

C 原型模式提供了简化的创建结构。

D 可以使用深克隆的方式保存对象的状态。 E 实现深克隆时需要编写较为复杂的代码。 F 需要为每一个类配备一个克隆方法 7.单例模式的要点( ) A 某个类只能有一个实例 B 必须自行创建这个实例

C 必须自行向整个系统提供这个实例 D 类的方法不能被访问 E 实例的创建个数不受限制 F 实例的创建者不受限制 8.适配器模式的优点( )

A将目标类和适配者类解耦 B增加了类的透明性和复用性

C灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器

D其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。 E要想置换适配者类的方法不容易

9. 组合模式包含角色有( )

A 抽象构件 B 叶子构件 C 容器构件 D 客户类 E 树根构 F 枝干构件 10桥接模式的优点( )

A分离抽象接口及其实现部分。 B桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。

C 实现细节对客户透明,可以对用户隐藏实现细节。 D桥接模式的引入会增加系统的理解与设计难度

E桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

三:简答题(共2道题,每道10分)

1. 什么是开--闭原则。

2. 画出抽象工厂的类图。

四:读程序题(1道,每道10分)

读下面程序,并指出是何种模型,以及该模型都有那些角色 public class Bird{

public void tweedle(){

System.out.println(\鸟儿叽叽叫!\

}

public void fly(){ System.out.println(\鸟儿快快飞!\ } }

public class BirdAdapter extends Bird implements Robot{

public void cry(){

System.out.print(\机器人模仿:\

super.tweedle(); }

public void move(){ System.out.print(\机器人模仿:\ super.fly(); } }

public class Dog { public void wang() { System.out.println(\狗汪汪叫!\ } public void run() { System.out.println(\狗快快跑!\ } }

public class DogAdapter extends Dog implements Robot { public void cry() { System.out.print(\机器人模仿:\ super.wang(); } public void move() { System.out.print(\机器人模仿:\ super.run(); } }

public interface Robot{

public void cry(); public void move(); }

public class Client{

public static void main(String args[]){ Robot robot=(Robot)XMLUtil.getBean(); robot.cry();

robot.move(); } }

import javax.xml.parsers.*; import org.w3c.dom.*;

import org.xml.sax.SAXException; import java.io.*;

public class XMLUtil{

//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象 public static Object getBean(){ try{ //创建文档对象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File(\ //获取包含类名的文本节点 NodeList nl = doc.getElementsByTagName(\ Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); //通过类名生成实例对象并将其返回 Class c=Class.forName(cName); Object obj=c.newInstance(); return obj; }

catch(Exception e){ e.printStackTrace(); return null; } } }

- BirdAdapter