软件设计期末试卷2020级

发布时间 2023-12-20 20:06:19作者: 秃头的小白
第1页 /共 6页
石家庄铁道大学 2022 年秋季学期
2020 级本科期末考试试卷(A)
课程名称:软件设计(闭卷)
任课教师: 王辉
考试时间:100 分钟
学号:
姓名:
班级:
考试性质(学生填写):正常考试( )缓考( )补考( )重修( )提前修读( )
总分
10
20
20
20
15
15
100
阅卷人
本试卷满分 100 分,共六道大题。要求所有答案请写在答题纸上,并请写明题号。
一、单项选择题:在每小题列出的选项中只有一个选项是符合要求的,请选择正确选项。
(每小题 2 分,共 10 分, 答题时请写明题号)
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. 迪米特法则二、简答题(共 3 题,共 20 分)
1. 软件设计模式的定义?(4分)
2. 软件设计模式根据目的可以分为哪三类?并简单介绍每一类的目的和功能?(8分)
3. 什么是迭代器模式?举一个使用该模式的例子?(8分)
三、设计模式选择填空题(共 5 空,每空 4 分,共 20 分)。
从简单工厂、工厂方法、抽象工厂、建造者、原型、单例、适配器、装饰、享元、代理、
职责链、解释器、迭代器、中介者、备忘录、状态、策略、模板方法和访问者中选择 5
个填到下面合适的空缺上。
1. 当应用程序由于使用大量的对象,造成很大的存储开销时,可以采用__________模式
运用共享技术来有效地支持大量细粒度的对象。
2. __________模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个
实例。
3. __________模式在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外
保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
4. __________模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
5. __________模式将一个接口转换成客户希望的另一个接口,使得接口不兼容的那些类
可以一起工作。
四、程序填空题:请根据下述问题的说明、类图和程序运行结果将对应的 JAVA 代码补
写完整,答题时请标明每一空的编号。(共 4 空,每空 5 分,共 20 分)
问题说明:
某软件系统中定义了类 OfficeData 和 OfficeExplorer。当类 OfficeData 发生变化时,类
OfficeExplorer 都要更新其自身状态,现采用观察者(Observer) 设计模式来实现该需求。
第2页 /共 6页第3页 /共 6页
类图的核心部分:
JAVA 代码:
//Subject.java
import java.util.*;
public abstract class Subject
{
protected ArrayList<Observer> observers;
public Subject()
{
observers = new ArrayList<
空 1
>();
}
public void Attach(Observer observer)
{
空 2
;
}
public void Detach(Observer observer)
{
observers.remove(observer);第4页 /共 6页
}
public abstract void Notify();
}
//Observer.java
public abstract class Observer
{
public abstract void Update();
}
//OfficeData.java
public class OfficeData extends Subject
{
public void Notify()
{
for(Observer obs:this.observers)
{
空 3
;
}
}
}
//OfficeExplorer.java
public class OfficeExplorer extends Observer
{
private String myObsName;
public OfficeExplorer(String name)
{
myObsName = name;
}
public void Update()第5页 /共 6页
{
System.out.println("Update observer: " + myObsName);
}
}
//Client.java
public class Client
{
public static void main(String a[])
{
Subject subject = new OfficeData();
Observer observer1 = new OfficeExplorer("Observer 1");
Observer observer2 = new OfficeExplorer(
空 4
);
subject.Attach(observer1);
subject.Attach(observer2);
subject.Notify();
System.out.println("After");
subject.Detach(observer1);
subject.Notify();
}
}
程序运行结果:
Update observer: Observer 1
Update observer: Observer 2
After
Update observer: Observer 2五、类图解释题:对于下述类图,说明对应的设计模式的名称,简单描述该模式,并给
出该模式的一个使用例子。(共 15 分,其中软件设计模式的名称 4 分,模式描述 5 分,
模式使用例子 6 分)
六、分析设计题:对于下述场景,选择合适的软件设计模式进行设计,说明选用的设计
模式的名称,简单描述该模式,并画出对应的类图。(共 15 分,其中软件设计模式的名
称 3 分,模式描述 4 分,类图 8 分)
需要开发一个软件公司的网站,公司主页打开时能够同时打开设计部、开发部和测试部
的子网站,公司主页关闭时能够关闭三个部门的子网站。
第6页 /共 6页