|
东 北 大 学 继 续 教 育 学 院
7 }; w F- T [2 Y( v 软件设计模式 X 试 卷(作业考核 线上2) A 卷(共 7 页) - i3 M9 A. S# R6 i& T4 y" i& M
总分 题号 一 二 三 四 五 六 七 八 九 十. z; x6 W; O) Q% D/ t, Z
得分 " L, y/ N( N8 R
一、单选题(共40分,每题2分)
/ \8 }6 f5 A( {* B3 q# |1. 常用的基本设计模式可分为(). ]6 ?3 m" O0 g. d3 r
A.创建型、结构型和行为型 B. 对象型、结构型和行为型; B; I# m1 i- V$ V8 X& e7 f8 c
C.过程型、结构型和行为型 D. 抽象型、接口型和实现型/ U7 P, {* h- d% r1 A
2. 对以下开闭原则的描述错误的是()* w+ | {8 y# Z3 F
A.开闭原则与“对可变性的封装原则”没有相似性 ) M" L0 [8 S& T9 Z# ~& z
B.找到个系统的可变元素,将它封装起来,叫开闭原则
- I( L G' ~3 ?) ?8 H" UC.对修改关闭,是其原则之一8 b# S7 c6 m- V; i
D.从抽象层导出一个或多个新具体类可以改变系统的行为,是其原则之一1 R; F" V) {/ M% g4 S6 I
3. “不要和陌生人说话”是()原则的通俗表述。9 [/ V5 G% T( O5 Q1 o2 M! G+ m2 @
A. 接口隔离 B. 里氏替换 C. 依赖倒置 D. 迪米特
7 ^8 X7 g+ N/ W( i! V8 h# v. A4. 当创建一个具体的对象而又不希望指定具体的类时,可以使用()
: S8 w: u4 Q1 X% a$ }3 ?A. 结构型 B. 创建型 C. 行为型 D.以上都可以
2 B# Q6 i3 u! [* f# }' [% l/ s' G5. 以下( )是利用一个对象,快速地生成一批对象。' Z2 h) o% y D2 {
A. 抽象工厂(Abstract Factory)模式 B. 原型(Prototype)模式; g1 ?$ M& E5 \) x5 Z
C. 合成(Composite)模式 D. 桥接(Bridge)模式
7 N$ E( A z% ^$ a: f0 n6. 以下( )用来描述建造者( Builder )。' n. ~* ^% o* g9 W1 _' F
A. 定义一个用于创建对象的接口,让子类决定实例化哪一个类/ v7 W) r0 f( P% g/ I; @
B. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示8 M8 N' {- \$ }4 r/ v1 i
C. 保证一个类仅有一个实例,并提供→个访问它的全周访问点5 d0 C; d+ E4 H
D. 运用共享技术有效地支持大量细粒度的对象8 x+ Y# c2 }( g g% ^) g9 |
7. 以下( )用来描述工厂方法(Factory Method)模式。' F% W+ I# x; n2 P- O
A. 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类5 b5 K+ X k0 {2 x! o% D2 r, P4 K$ r5 o
B. 表示一个作用于某对象结构中的各元素的操作。它使用户可以在不改变各元素的类的前提下定义作用于这些元素的新操作
0 m9 x6 {$ a9 r: NC. 定义一个用于创建对象的接口,让子类决定实例化哪一个类。该模式使一个类的实例化延迟到其子类) [; v3 _0 q! T3 K6 A
D. 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化
1 |6 K. r* ~# W$ X8. 对象适配器模式是( )原则的典型应用。
g+ p2 Z( x, @; WA. 将一个类的接口转换成客户希望的另外一个接口,本模式使原本由于接口不兼容而不能一起工作的那些类可以一起工作。4 `( N, ?7 A0 a, f$ d3 W4 T
B. 定义一个用于创建对象的接口,让子类决定实例化哪一个类
2 @0 K' |) u' tC. 表示一个作用于某对象结构中的各元素的操作,它使用户可以在不改变各元素的类的前提下定义作用于这些元素的新操作
/ t' l0 a& J1 }; `8 `" I7 N9 v% o& h1 oD. 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作
o& u3 L4 z4 \. ]/ Y1 }' t9. 关于模式适用性,以下( )不适合使用Flyweight(享元)模式。( a! e- }2 g. B: d. p
A. 一个应用程序使用了大量的对象
7 }! j: b% |6 ?B. 完全由于使用大量的对象, 造成很大的存储开销
& X- R) x3 C) j7 K5 S# t- \C. 对象的大多数状态都可变为外部状态
7 v# x0 q% v% U; T! p1 KD. 用户想使用一个已经存在的类,而它的接口不符合用户的需求 j1 K" O4 A D, }" `
10. 如果有一个2MB 的文本(英文字母),为了对其中的字母进行分类和计数,若为文本中的每个字母都定义一个对象显然不合实际,对与该问题最好可使用的模式是( )。: {5 z0 G* m( @1 I, _$ g9 d
A. 装饰(Decorator)模式 B. 享元( Flyweight )模式 ! k$ a& {8 }) y* m& a6 W& J I
C. 合成(Composite)模式 D.命令(Command)模式
- u2 n0 [( W* y% Z6 r# V11. 关于模式适用性, 以下( )适合使用组合(Composite) 模式。
6 l/ V7 I0 h$ A( b) [$ vA. 用户想使用一个已经存在的类, 而它的接口不符合用户的需求% k3 T! |- g. J5 K3 E
B. 当一个类的实例只能有几个不同状态组合中的一种时4 a' J0 G! Q1 I9 q% F" ^1 u
C. 用户想表示对象的部分-整体层次结构& |1 |+ x: y' m* I# j
D. 一个对象的行为取决于它的状态, 并且它必须在运行时根据状态改变它的行为4 q3 H- _. N- @2 d+ R( S, S6 h
12. 以下意图( )可用来描述命令(Command)。
& k3 s4 V4 a& q; r6 f. eA. 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作
4 s ~% d/ Z, |5 E, SB.定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换, 本模式使得算法可独立于使用它的客户而变化* P$ \+ h4 X7 p) X% z( q; C+ I
C. 为其他对象提供一种代理以控制对这个对象的访问7 a6 c# o# S1 b
D. 保证一个类仅有一个实例,并提供一个访问它的全局访问点; J% } y2 ^) `- W! [! n7 m
13. 以下不属于行为型模式的是( )。
. J& b- `, n0 \9 bA.命令(Command ) B.策略(Strategy) C. 备忘录(Memento ) D.桥接(Bridge )
# J- c. a: q% t' o9 d: \) S9 H0 S14. 关于模式适用性, 以下( )不适合使用模板方法(Template Method) 模式。
- y! \0 [7 j" ?0 p/ J$ IA. 一次性实现-个算法的不变的部分,并将可变的行为留给子类来实现
0 y3 L$ q, p5 ?" }8 D3 BB. 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
' Z9 t# O' R ^% fC. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码
: ]% o3 D7 j0 G1 m: dD.控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展
) Z* G1 c, i, d- g15. 关于模式适用性,( )不适合使用职责链(Chain of Responsibility)模式。
; X9 |9 ~, ]# S/ j5 VA. 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定/ u* ^% I4 F( c( ~3 e0 e
B. 在需要用比较通用和复杂的对象指针代替简单的指针的时候
! G0 F0 z- P8 {# S. AC. 用户想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求
5 `; }, E' S1 X: mD. 可处理一个请求的对象集合应被动态指定
% t" [+ a! N8 y" t* ^0 m9 [7 C16. 以下意图( )可用来描述中介者(Mediator) 。
/ i) n$ w7 i' n, ^7 bA. 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示0 F h& B% |; j: Y* S7 N; [
B. 将抽象部分与它的实现部分分离, 使它们都可以独立变化9 e2 D; E4 r; O5 i6 b" s4 v- R
C. 定义一个用于创建对象的接口,让子类决定实例化哪一个类$ n- i6 C# Y& V6 A: g
D. 用-个中介对象来封装一系列的对象交互
: s+ v3 X. F, X* m# w; D% ^17. 以下意图( )可用来描述解释器(Interpreter)。' B5 y8 o j, U# g- h
A. 将抽象部分与它的实现部分分离,使它们都可以独立变化
3 S0 H1 D/ K" Z( Q; a! Z6 X! mB. 给定一个语言, 定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子: h. h6 a. u! S$ f" [
C. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
, j% @1 k6 }) k* `" qD. 为其他对象提供一种代理以控制对这个对象的访问
. r" m5 O7 U0 z7 a) o1 {18. 以下意图( )可用来描述访问者(Visitor )。5 b) |$ p( H& M3 Z' y
A. 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对都得到通知并被自动更新
* A* L* R# b0 p. [4 s. ZB. 表示一个作用于某对象结构中的各元素的操作$ J+ q6 r" a5 a& E! O, B
C. 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. J$ d4 L: o6 m$ G* _9 m
D. 用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象
1 w6 t- r4 H8 V+ S) [19. 以下意图( )可用来描述状态( State )。+ s, `6 f/ a/ |! e8 O9 J
A. 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的精合关系
# s: S" H' i( y9 V5 ]B. 提供一种方法顺序访问一个聚合对象中各个元素而又不需暴露该对象的内部表示" o# ^: a# c; s! V7 n6 @. ]; |! _
C. 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类
) {8 @9 N8 M% J6 F. L: [D. 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态4 D2 Y2 x: L* v. K
20. 设计模式具有的优点()。
+ z* q% s7 t1 i! c* M) bA. 适应需求变化 B. 程序易于理解
* L0 E: ?' B; _C.减少开发过程中的代码开发工作量 D. 简化软件系统的设计
: e8 z) S% Z3 c2 W' l/ i二、多选题(共10分,每题2分)
# l$ u* w& m, V( B( f; n1. 以下是模式的基本要素的是( )。8 {: E7 @% `6 u; ?7 v! c
A. 名称 B. 意图 C. 解决方案 D. 参与者和协作者
! ?7 T H# I( [7 R, ^3 N2. 以下属于创建型模式的是( )。
j- z0 h% b! o6 S! MA.抽象工厂(Ab stract Factory)模式 B.合成(Composite) 模式' E6 C* v" y/ M8 g' j; ^
C. 单例(Singleton)模式 D. 桥接(Bridge)模式
^2 }/ T5 {7 P6 j |) _ X3. 以下关于结构型模式说法正确的是( )。 ; Z6 P: H* g2 ~6 @' U2 q- a
A. 结构型模式可以在不破坏类封装性的基础上, 实现新的功能; P4 E; S6 {* j
B. 结构型模式主要用于创建一组对象
# d# |$ q$ D1 {( a( p7 ~5 H; L# |4 LC. 结构型模式可以创建一组类的统→访问接口
* Z4 Z3 g' `8 b# Z4 y. F, rD. 结构型模式可以在不破坏类封装性的基础上, 使类可以同不曾估计到的系统进行交互
% ?( _( g0 m/ W8 ~4. 以下属于行为对象模式的是( )。# \1 W* H2 v, r5 j ]7 P+ o& d
A. 装饰(Decorator)模式 B. 迭代器(Iterator)模式
, r! G q9 J0 s- i+ |C. 命令(Command)模式 D. 中介者(Mediator)模式
/ H) Q+ m" e: K" d) s6 I/ H' N6 o5. 下面( )是访问者模式的优缺点。
% v) G7 X; H4 o6 N! C# l& w' o2 fA. 访问者模式使得易于增加新的操作 B. 访问者集中相关的操作而分离无关的操作
5 a# Y! B8 |, pC. 增加新的ConcreteElment 类很困难 D. 通过类层次进行访问
7 u- d {, f0 J/ o- t% \; B- _三、资料来源:谋学网(www.mouxue.com)(共10分,每题1分;请在认为正确的题目后面写T,错误的题目后面写F)
4 e% D- o) v+ \! `' b9 R% M1 |& I5 V1. 设计模式的两大主题是系统复用与系统扩展。( )
( T/ @2 |! s K: ^, f) j/ ~2. 抽象工厂模式提供了一系列相关或相互依赖对象的接口且必须指定他们具体的类。( )
6 Z* l9 H0 U$ R7 E1 _) p3. 对象适配器模式是依赖倒转原则的典型应用。( )
3 Q6 `' B: v" T s4. Open-Close原则的含义是一个软件实体应当对扩展开放,对修改关闭。( )
) g; y# ?$ _% w1 t- B* n/ P5. Singleton(单例)模式属于结构性模式。( )' b$ w/ g9 f- I4 a) L! \
6. 常用的设计模式可分为过程型、创建型和结构型。( )7 E J* U2 ?+ H1 `" {8 R
7. 对观察者模式,触发事件的对象——Subject对象不需要知道观察事件的所有对象。( )
6 \( o/ ^0 W9 {/ E3 w8. 通过在问题领域中使用模式,可以用一种不同的方式来看待问题。( )
/ N1 F r6 @/ U% |9 j; Y( J9. 对象适配器模式是依赖倒转原则的典型应用。( )5 ^$ G1 M' l) C' {2 p( g
10. Template Method是用以帮助从不同的步骤中抽象出一个通用的过程的模式。( )
9 O% W+ c" u8 D, g四、更多资料下载:谋学网(www.mouxue.com)(共15分,每题3分)6 j- w: E6 E! i j; P
1. 设计模式- Y& L! {2 J/ R8 P J
' D x8 J$ d9 R' _: S9 F ?
, J6 [% V2 y, ~ R* c2. 开闭原则( N3 O7 o3 s, l' ^! Y9 P# d
% n* g$ M2 c' I* J* B& v$ U8 b
1 o7 i/ ^% c4 n/ A5 ~* p/ {) R3.单一职责原则6 C" j5 f# P7 b0 |$ ?, m7 s8 \
+ z6 c4 E# j7 N6 z# n4 [
% ~7 F! U9 U) R! b3 B7 O4.依赖关系7 r* o6 n( [. M
9 m$ A6 U3 c8 s# W# ~3 T
$ s+ Y, e! ~4 b0 w* B6 f5.组合关系2 q9 ]4 j; ^- U$ W( @; k
* Q0 X2 V7 n/ e( h4 @* n
* N( L* O& ]- K1 L
* _8 ^$ C4 P0 Q1 d }
五、更多资料下载:谋学网(www.mouxue.com)(共15分,每题5分)5 i8 k, s+ M, r' O; o
1. 设计模式一般有哪几个基本要素?1 M( z+ u4 r7 n
/ ]6 M% V, ]& X# W1 |- j
w5 [( \/ j4 N
. z6 d, k1 [* j( {
Z$ A! D6 r$ G8 P" H3 S* p3 G. M3 y2 n# Q* w9 J9 d
2. 创建型模式分包括哪几种设计模式,各是什么并简要说明。5 P$ T! O9 s6 d7 `: y. y
* n, B* H( H& a V+ A4 v: M
, ] V2 W4 L( E) _2 ?. d D+ p* c! G( G8 x5 H3 S1 A
( r# l; f0 @( }* n! w0 z$ E4 M3 u$ B0 G5 z2 x- |! _1 o
# j& D- I1 t8 K5 k2 w2 a& q5 T3 p! R" ] p( P/ r1 W5 i- h
3. 说明访问者模式的定义与主要优缺点。6 w! l; j" g% L
% V) J A* \( O
1 z1 `% Z8 u: T7 f* y8 h9 k9 ~% j+ Y7 C( U3 v4 U$ v: h
1 b6 v5 c/ n! |# i8 {2 w. c6 d& X' D4 `6 y
C! T& R8 T% z- B( D
* w4 @9 t: j Y: @$ b2 v! y# t+ h% Z. y- a" b
9 O* {) e. c/ n ?2 Z
六、综合题(共10分); p: V0 [/ Y) a3 Z$ B0 V
当“人民币汇率” 升值时, 进口公司的进口产品成本降低且利润率提升,出口公司的出口产品收入降低且利润率降低; 当“人民币汇率” 贬值时,进口公司的进口产品成本提升且利润率降低, 出口公司的出口产品收入提升且利润率提升。利用观察者模式设计一个程序, 分析“人民币汇率”的升值或贬值对进口公司的进口产品成本或出口公司的出口产品收入以及公司的利润率的影响。! O4 I' N5 R) r, N
提示:这里的汇率(Rate) 类是抽象目标类,它包含了保存观察者(Company ) 的List 和增加/删除观察者的方法, 以及有关汇率改变的抽象方法change(int number); 而人民币汇率(RMBrate)类是具体目标,它实现了父类的change(int number)方法,即当人民币汇率发生改变时通过相关公司; 公司(Company)类是抽象观察者, 它定义了一个有关汇率反应的抽象方法respons巳(int number); 进口公司( ImportCompany )类和出口公司( E xportCompany )类是具体观察者类,它们实现了父类的response(int: N- S; _# ~& O: p2 M3 h
number)方法, 即当它们接收到汇率发生改变的通知时作为相应的反应。
9 ~9 [7 y- L. L% v请画出该程序的类图。
2 Q* {- z. e& L! [+ q8 }( Y" x
' N; X/ ~: ^# g7 _; Z: m5 J- D! D! c5 R1 L! Q# T7 P& \
* G' F6 c4 {& B' M$ J- Y8 a5 ]
$ R( f5 a, ?! t0 H; S' K; m6 Y
, A( |! Q5 P* V2 ]1 _- b, E
, \, H2 F/ U z& I
j7 p, {) ~5 ]$ Y( ], C
! U5 m% V e* q) s/ J( d J! I) J' V; r- b) u
+ r: Q5 g5 \9 Y6 W2 v9 X" o8 ~
1 [$ J/ C; A$ p2 A$ i2 @, x+ n% J4 T
. M% D6 ]8 d3 _ T; `. w5 w" S
9 }2 H# l7 Z- ~9 ~9 o) V# x( \5 G, K2 k, Z% N! D2 {
2 H. z2 i7 G Q! Z/ d0 F( |* s2 y, ?# Z H
8 E; n: w. x6 M! b0 [# N
; ?& x" J! g4 Y ~4 l
1 M) t, s. _, j- d: l/ |
$ a, U( x5 b& o
|
|