第4章结构型模式实训Word版.docx
《第4章结构型模式实训Word版.docx》由会员分享,可在线阅读,更多相关《第4章结构型模式实训Word版.docx(33页珍藏版)》请在冰点文库上搜索。
第4章结构型模式实训Word版
第4章结构型模式实训
4.3实训练习
4.3.1选择题
1.某公司开发一个文档编辑器,该编辑器允许在文档中直接嵌入图形对象,但开销很大。
用户在系统设讣之初提岀编辑器在打开文档时必须十分迅速,可以暂时通过一些符号来表示相应的图形。
针对这种需求,公司可以采用()避免同时创建这些图形对象。
A.代理模式B.外观模式
C.桥接模式D.组合模式
2.下面的()模式将对象组合成树形结构以表示“部分-整体”的层次结构,并使得用户对单个对象和组合对象的使用具有一致性。
A.组合(Composite)B.桥接(Bridge)
C.装饰(Decorator)D.外观(Facade)
3.已知某子系统为外界提供功能服务,但该子系统中存在很多粒度十分小的类,不便被外界系统直接使用,采用()设计模式可以泄义一个髙层接口,这个接口使得这一子系统更加容易使用。
A.Facade(外观)B・Singleton(单例)
C.Participant(参与者)D.Decorator(装饰)
4.当不能采用生成子类的方法进行扩充时,可采用()设汁模式动态地给一个对象添加一些额外的职责。
A.Facade(外观)B・Singleton(单例)
C.Participant(参与者)D.Decorator(装饰)
5.
(①)设计模式将抽象部分与它的实现部分相分离,使它们都可以独立地变化。
下图为该设计模式的类图,其中,(②)用于泄义实现部分的接口。
6.(①)限制了创建类的实例数量,而(②)将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
)设汁模式运用共享技术来有
①A.命令模式(Command)
B.
适配器模式(Adapter)
C.策略模式(Strategy)
D.单例模式(Singleton)
②A.命令模式(Command)
B.
适配器模式(Adapter)
C.策略模式(Strategy)
D.单例模式(Singleton)
7.一个树形文件系统体现了()模式。
A.Decorator(装饰)
B.
Composite(组合)
C.Bridge(桥接)
D.
Proxy(代理)
8•当应用程序由于使用大量的对象,造成很大的存储开销时,可以采用(
效地支持大量细粒度对象的重用o
A.Facade(外观)B.Composite(组合)
C.Flyweight(享元)D.Adapter(适配器)
9.
)设计模式将该类的接口转换成我
当想使用一个已经存在的类,但其接口不符合需求时,可以采用(们希望的接口。
A.命令(Command)B.适配器(Adapter)
C.装饰(Decorator)D.享元(Flyweight)
10.以下关于适配器模式的叙述错误的是()0
A.适配器模式将一个接口转换成客户希望的另一个接口,使得原本接口不兼容的那些类可以一起工作
B.在类适配器中,Adapter和Adaptee是继承关系,而在对象适配器中,Adapter和Adaptee是关联关系
C.类适配器比对象适配器更加灵活,在Java、C#等语言中可以通过类适配器一次适配多个适配者类
D.适配器可以在不修改原来的适配者接口Adaptee的情况下将一个类的接口和期一个类的接口匹配起来
11•现需要开发一个文件转换软件,将文件由一种格式转换为另一种格式,如将XML文件转换为PDF文件,将DOC文件转换为TXT文件,有些文件格式转换代码已经存在,为了将已有的代码应用于新软件,而不需要修改软件的整体结构,可以使用()设计模式进行系统设计。
A.适配器(Adapter)B.组合(Composite)
C.外观(Facade)D.桥接(Bridge)
12.在对象适配器中,适配器类(Adapter)和适配者类(Adaptee)之间的关系为()。
A.关联关系B.依赖关系
C.继承关系D.实现关系
13.()是适配器模式的应用实例。
A.操作系统中的树形目录结构
B.Windows中的应用程序快捷方式
C.Java事件处理中的监听器接口
D.JDBC中的数据库驱动程序
14.以下陈述不属于桥接模式优点的是()。
A.分离接口及其实现部分,可以独立地扩展抽象和实现
B.可以使原本由于接口不兼容而不能一起工作的那些类一起工作
C.可以取代多继承方案,比多继承方案扩展性更好
D.符合开闭原则,增加新的细化抽象和具体实现都很方便
15.以下关于桥接模式的叙述错误的是()0
A.桥接模式的用意是将抽象化与实现化脱耦,使得两者可以独立地变化
B.桥接模式将继承关系转换成关联关系,从而降低系统的耦合度
C.桥接模式可以动态地给一个对象增加功能,这些功能也可以动态地撤销
D.桥接模式可以从接口中分离实现功能,使得设计更具扩展性
16.()不是桥接模式所适用的场景。
A.一个可以跨平台并支持多种格式的文件编辑器
B.一个支持多数据源的报表生成工具,可以以不同图形方式显示报表信息
C.一个可动态选择排序算法的数据操作工具
D.一个支持多种编程语言的跨平台开发工具
17.以下关于组合模式的叙述错误的是()。
A.组合模式对叶子对象和组合对象的使用具有一致性
B.组合模式可以通过类型系统来对容器中的构件实施约朿,可以很方便地保证在一个容器中只能有某些特定的构件
C.组合模式将对象组织到树形结构中,可以用来描述整体与部分的关系
D.组合模式使得可以很方便地在组合体中加入新的对象构件,客户端不需要因为加入新的对象构件而更改代码
18.下图是()模式的结构图。
A.模板方法B.命令
C.单例D.组合
19•现需要开发一个XML文档处理软件,可以根据关键字查询指立内容,用户可以在XML中任意选取某一节点为查询的初始节点,无须关心该节点所处的层次结构。
针对该需求,可以使用()模式来进行设计。
A.AbstractFactory(抽象工厂)B.Flyweight(享元)
C.Composite(组合)D.Strategy(策略)
20.某公司欲开发一个图形控件库,要求可以在该图形控件库中方便地增加新的控件,而且可以动态地改变控件的外观或给控件增加新的行为,如可以为控件增加复杂的立体边框、增加控件的鼠标拖拽行为等。
针对上述需求,使用()模式来进行设计最合适。
A.适配器(Adapter)B.装饰(Decorator)
C.外观(Facade)D.命令(Command)
21.以下()不是装饰模式的适用条件。
A.要扩展一个类的功能或给一个类增加附加责任
B.要动态地给一个对象增加功能,这些功能还可以动态撤销
C.要动态组合多于一个的抽象化角色和实现化角色
D.要通过一些基本功能的组合而产生复杂功能,而不使用继承关系
22.Java10库的设计使用了装饰模式,局部类图如下所示,在该类图中,类(①)充当具体构件ConcreteComponent,类(②)充当抽象装饰器Decorator.类(③)充当具体装饰器ConcreteDecorator0
①
A.
OutputStream
B.
FileOutputStream
C.
FilterOutputStream
D・BufferedOutputStream
②
A.
OutputStream
B.
FileOutputStream
C.
Fi1terOutputStream
D・BufferedOutputStream
③
A.
OutputStream
B.
FileOutputStream
C.
Fi1terOutputStream
D・BufferedOutputStream
23・下图是()模式的类图。
A.桥接(Bridge)B.工厂方法(FactoryMethod)
C.模板方法(TemplateMethod)D.外观(Facade)
24.以下关于外观模式的叙述错误的是()。
A.外观模式要求一个子系统的外部与•其内部的通信必须通过一个统一的外观对象进行
B.在增加外观对象之后,客户类只需要直接和外观对象交互即可,子系统类间的复杂关系由外观类来实现,降低了系统的耦合度
C.外观模式可以很好地限制客户使用(系统类,对客户访问了系统类做限制可以提高系统的灵括性
D.如果-个系统有好几个子系统的话,可以提供多个外观类
25.在享元模式中,外部状态是指()。
A.享元对象可共享的所有状态
B.享元对象可共享的部分状态
C.由享元对彖自己保存和维护的状态
D.由客户端保存和维护的状态
26.以下关于享元模式的叙述错误的是()。
A.享元模式运用共享技术有效地支持大量细粒度对象的复用
B.在享元模式中可以多次使用某个对象,通过引入外部状态使得这些对象可以有所差异
C.享元对象能够做到共享的关键是引入了享元池,在享元池中通过克隆方法向客户端返回所需对象
D.在享元模式中,外部状态是随环境改变而改变、不可以共享的状态,而内部状态是不随环境改变而改变、可以共享的状态
27.为了节约系统资源,提高程序的运行效率,某系统在实现数据库连接池时可以使用()设计模式。
扎外观(Facade)B.原型(Prototype)
C.代理(Proxy)D.享元(Flyweight)
28.毕业生通过职业介绍所找工作,该过程蕴含了()模式。
A.外观(Facade)B.命令(Command)
C.代理(Proxy)D.桥接(Bridge)
29.代理模式有多种类型,其中智能引用代理是指()。
A.为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果
B.保护目标不让恶意用户接近
C.使几个用户能够同时使用一个对象而没有冲突
D.当一个对彖被引用时,提供一些额外的操作,如将此对彖彼调用的次数记录下来
30.以下关于代理模式的叙述错误的是()。
A.代理模式能够协调调用者和被调用者,从而在一泄程序上降低系统的耦合度
B.控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限时可以考虑使用远程代理
C.代理模式的缺点是请求的处理速度会变慢,并且实现代理模式需要额外的工作
D.代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用
4.3.2填空题
1.某公司欲开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示,在该公司以往的产品中已经实现了控制灯光闪烁和声音提示的程序,为了重用先前的代码并且使得汽车控制软件具有更好的灵活性和扩展性,使用适配器模式设讣该系统,所得类图如图1所示。
图1类图
在图1中,CarController类是汽车控制器,它包括三个方法用于控制汽车的行为,苴中move()用于控制汽车的移动,sound0用于控制汽车的声light()用于控制汽车灯光的闪烁,sound0和light。
是抽象方法。
Sound类是抽象声音类,其方法phonateO用于实现声音提示,在其子类ConcreteSound中实现了该方法:
Lamp类是灯光类,其方法twinkle()用于实现灯光闪烁,在其子类ConcreteLamp中实现了该方法。
CarAdapter充当适配器,它通过分别调用Sound类的phonate0方法和Lamp类的twinkle0方法实现声音播放和灯光闪烁。
[Java代码】abstractclassSound//抽象声音类:
、publicabstractvoidphonate();}
classConcreteSoundextendsSound//具体声音类
{
publicvoidphonate()
{System,out.printIn(*声音播放!
”);}
}
abstractclassLamp//抽象灯光类
:
、publicabstractvoidtwinkle();}
classConcreteLampextendsLamp//具体灯光类
{
publicvoidtwinkle()
{System,out.println(//灯光闪烁!
");}
}
(1)CarController//汽车控制器
{
publicvoidmove()
{System,out.printing汽车移动!
”);}
publicabstractvoidsound();publicabstractvoidlight();
}
classCarAdapter
(2)//汽车适配器
{
privateSoundsound;
privateLamplamp;
publicCarAdapter(Soundsound,Lamplamp)
{
(3);
(4):
}
publicvoidsound()
{
(5);//声音播放
}
publicvoidlight()
{
(6);//灯光闪烁
}
}
classClient
{
publicstaticvoidmain(Stringargs[])
{
Soundsound;
Lamplamp;
CarControllercar;
sound=newConcreteSound0;
lamp=newConcreteLampO;
car=(7);
car・move0;
car・sound0;
car・light();
}
}
在本实例中,使用了(8)(填写类适配器或对象适配器)模式。
2.现欲实现一个图像浏览系统,要求该系统能够显示BMPJPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。
系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。
系统需具有较好的扩展性以支持新的文件格式和操作系统。
为满足上述需求并减少所需生成的子类数目,采用桥接设汁模式进行设讣所得类图如图1所示。
图1类图
采用该设讣模式的原因在于:
系统解析BMP、JPEG与GIF文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。
[Java代码】
classMatrix{//各种格式的文件最终都被转化为像素矩阵
//此处代码省略
}
interfaceImageImp{
publicvoiddoPaint(Matrixm);//显示像素矩阵m
}
classWinimpimplementsImageimp:
、
publicvoiddoPaint(Matrixm){/*调用Windows系统的绘制函数绘制像素矩阵*/}
}
classLinuxlmpimplementsImageImp{
publicvoiddoPaint(Matrixm){/*调用Linux系统的绘制函数绘制像素矩阵*/}
}
abstractclassImage{
publicvoidsetimp(Imageimpimp){W=imp;}publicabstractvoidparseFile(StringfileName);protected
(2)imp;
}
classBMPextendsImage{
publicvoidparseFile(StringfileName){
〃此处解析BMP文件并获得一个像素矩阵对象m(3);//显示像素矩阵m
}
}
classGIFextendsImage{
//此处代码省略
}
classJPEGextendsImage{
//此处代码省略
}
publicclassMain{
publicstaticvoidmain(Stringargs)
{
//在Windows操作系统上查看demo,bmp图像文件
Imageimagel=Cl);
ImageimpimageImp1=(5);
(6);image1・parseFile(z,demo・bmp");
}
}
现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix和类Main,若采用桥接模式则至少需要设计(7)个类。
3.某公司的组织结构图如图1所示,现采用组合设计模式来设汁,得到如图2所示的类图•
图1组织结构图
图2类图
其中Company为抽象类,泄义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。
类ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以设宜不同的部门。
类HRDepartment和FinanceDepartment分别表示人力资源部和财务部。
(Java代码】
importjava.util.*;
(1)Company{
protectedStringname;
publicCompany(Stringname){
(2)=name;}
publicabstractvoidAdd(Companyc);//增加子公司、办事处或部门
publicabstractvoidDelete(Companyc);//删除子公司、办事处或部门
}
classConcreteCompanyextendsCompany{
privateList<(3)>children=newArrayList<(4)>0;//存储
子公司、办事处或部门
publicConcreteCompany(Stringname){super(name);}
publicvoidAdd(Companyc){(5)・add(c);}
publicvoidDelete(Companyc){(6)remove(c);}
classHRDepartmentextendsCompany{
publicHRDepartment(Stringname){super(name);}
//其他代码省略
}
classFinaneeDepartmentextendsCompany{
publicFinanceDepartment(Stringname){super(name);}
//其他代码省略
}
publicclassTest{
publicstaticvoidmain(String[]args){
ConcreteCompanyroot=newConcreteCompany("」匕京总公司");root.Add(newHRDepartmentC总公司人力资源部"));root.Add(newFinanceDepartmentC总公司财务部"));
ConcreteCompanycomp=newConcreteConipany("上海分公司");
comp.Add(newHRDepartmentC上海分公司人力资源部"));comp.Add(newFinanceDepartmentC上海分公司财务部"));
(7);
ConcreteCompanycompl=newConcreteCompany("南京办事处");compl.Add(newHRDepartmentC*南京办事处人力资源部"));compl.Add(newFinanceDepartmentC南京办事处财务部"));
⑻;//其他代码省略
}
}
4.某公司欲开发一套手机来电提示程序,在最简单的版本中,手机在接收到来电时会发岀声音来提醒用户:
在振动版本中,除了声音外,在来电时手机还能产生振动:
在更髙级的版本中手机不仅能够发声和产生振动,而且还会有灯光闪烁提示。
现采用装饰设汁模式来设讣,得到如图1所示的类图。
Cellphone
+receiveCall():
void
JarPhone
ComplexPhone
+JarPhone(Cellphonephone)
+receiveCall():
void
+ComplexPhone(Cellphonephone)
+receiveCall0:
void
图1类图推荐精选
苴中Cellphone为抽象类,声明了来电方法receiveCall()tSimplePhone为简单手机类,提供了声音提示,JarPhone和Comp1exPhone分别提供了振动提示和灯光闪烁提示。
PhoneDecorator是抽象装饰者,它维持一个对父类对象的引用。
(Java代码】
abstractclassCellphone
{publicabstractvoidreceiveCall0;}
classSimplePhoneextendsCellphone
{
publicvoidreceiveCall0
{System,out.printlnC*声音提示");}
}
classPhoneDecoratorextendsCellphone
{
privateQJphone=null;
publicPhoneDecorator(Cellphonephone)
{
if(phone!
=null)
{⑵;}
else
{this・phone=newSimplePhone0;}
}
publicvoidreceiveCall0
{⑶;}
}
classJarPhoneextendsPhoneDecorator
{
publicJarPhone(Cellphonephone)
{⑷;}
publicvoidreceiveCall0
{
super・receiveCall0;
System,out.printIn(”振动提示");
}
}
classComp1exPhoneextendsPhoneDecorator
{
publicComplexPhone(Cellphonephone)
{(5);}
publicvoidreceiveCall0
{
super・receiveCall0;
System,out.printIn(”灯光闪烁提示");
}
}
classClient
{
publicstaticvoidmain(Stringa[])
{
Cellphonepl二new(6);//创建具有声音提