软件设计模式JAVA习题答案.docx
《软件设计模式JAVA习题答案.docx》由会员分享,可在线阅读,更多相关《软件设计模式JAVA习题答案.docx(29页珍藏版)》请在冰豆网上搜索。
![软件设计模式JAVA习题答案.docx](https://file1.bdocx.com/fileroot1/2022-12/13/6c835f3e-f427-49ae-99a1-297f0c662930/6c835f3e-f427-49ae-99a1-297f0c6629301.gif)
软件设计模式JAVA习题答案
软件设计模式(JAVA)习题答案
软件设计模式(Java版)习题
第1章软件设计模式基础
1.1软件设计模式概述
1.2UML中的类图
1.3面向对象的设计原则
1、名词解释
1.一个软件实体应当对扩展开放,对修改关闭,即在不修改源代码的基础上扩展一个系统的行为。
2.一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
3.在软件中如果能够使用基类对象,那么一定能够使用其子类对象。
4.是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
2、单选择题
1.(A)2.(A)3.(A)4.(D)5.(D)
6.(A)7.(D)8.(D)9.(D)10.(E)
11.(C)12.(C)13.(A)
3、多选择题
1.(A、B、C、D)2.(A、B)3.(A、D)4.(A、B、C、D)
4、填空题
1.依赖倒转、迪米特法则、单一职责
2.模式名字、目的、问题、解决方案、效果、实例代码
3.超类、子类
4.开闭
5.用户
6.依赖倒转
7.组合/聚合
8.结构型、行为型
9.依赖倒转
10.开闭
11.需求收集是否正确、体系结构的构建是否合理、测试是否完全
12.人与人之间的交流
13.接口
14.名称、目的、解决方案
15.对象组合、类继承
16.对象组合
17.对象组合、类继承
18.抽象类的指针
五、简答题
1.答:
设计模式按类型分为以下三类:
1)创建型设计模式:
以灵活的方式创建对象集合,用于管理对象的创建。
2)结构型设计模式:
将己有的代码集成到新的面向对象设计中,用于处理类或对象的组合。
3)行为型设计模式:
用于描述对类或对象怎样交互和怎样分配职责。
2.答:
设计模式的主要优点如下:
1)设计模式融合了众多专家的经验,并以一种标准的形式供广大开发人员所用,它提供了一套通用的设计词汇和一种通用的语言以方便开发人员之间沟通和交流,使得设计方案更加通俗易懂。
2)设计模式使人们可以更加简单方便地复用成功的设计和体系结构,将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
设计模式使得重用成功的设计更加容易,并避免那些导致不可重用的设计方案。
3)设计模式使得设计方案更加灵活,且易于修改。
4)设计模式的使用将提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本。
5)设计模式有助于初学者更深入地理解面向对象思想,一方面可以帮助初学者更加方便地阅读和学习现有类库与其他系统中的源代码,另一方面还可以提高软件的设计水平和代码质量。
3.答:
设计模式一般有如下几个基本要素:
模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式,其中的关键元素包括模式名称、问题、解决方案和效果。
4.答:
正确使用设计模式具有以下优点:
1可以提高程序员的思维能力、编程能力和设计能力。
2使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
3使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。
5.答:
根据类与类之间的耦合度从弱到强排列,UML中的类图有以下几种关系:
依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现关系。
其中泛化和实现的耦合度相等,它们是最强的。
6.答:
1)开闭原则(OCP):
它要求软件实体应当对扩展开放,对修改关闭;
2)里氏替换原则(LSP):
它要求继承必须确保超类所拥有的性质在子类中仍然成立;
3)依赖倒置原则(DIP):
它要求软件设计要面向接口编程,不要面向实现编程;
4)单一职责原则(SRP):
它要求对象不应该承担太多职责,一个类应该有且仅有一个引起它变化的原因;
5)接口隔离原则(ISP):
它要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法;
6)迪米特法则(LoD):
它要求如果两个软件实体无须直接通信,就不应当直接相互调用,而通过第三方转发该调用;
7)合成复用原则(CRP):
它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
第2章创建型模式(上)
2.2单例模式
2.3原型模式
1、单选择题
1.(A)2.(B)3.(A)4.(D)5.(C)
6.(B)7.(B)
2、多选择题
1.(C)2.(A,B)3.(A、B)4.(A、B、C)
5.(A、C)6.(A、B、C、D)7.(A,B,C,D)
3、填空题
1.对象的创建、使用分离、耦合度
2.创建型
3.创建性
4.懒汉式单例、饿汉式单例
5.抽象原型类、具体原型类
4、程序分析题解:
本题使用了单例模式,参考类图如下所示:
5、简答题
1.答:
创建型模式分为以下几种:
1单例(Singleton)模式:
某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
2原型(Prototype)模式:
将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
3工厂方法(FactoryMethod)模式:
定义一个用于创建产品的接口,由子类决定生产什么产品。
4抽象工厂(AbstractFactory)模式:
提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
5建造者(Builder)模式:
将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
2.答:
单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。
整个应用中只维护一个特定类实例,它被所有组件共同使用。
Java.lang.Runtime是单例模式的经典例子。
从Java5开始你可以使用枚举(enum)来实现线程安全的单例。
3.答:
单例(Singleton)模式的定义:
指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
特点:
1)单例类只有一个实例对象;2)该单例对象必须由单例类自行创建;3)单例类对外提供一个访问该单例的全局访问点。
应用场景:
1)在某类只要求生成一个对象的时候;2)当对象需要被共享的场合;3)当某类需要频繁实例化,而创建的对象又频繁被销毁的时候。
4.答:
原型模式通常适用以下场景:
1)对象之间相同或相似,即只是个别的几个属性不同的时候;2)对象的创建过程比较麻烦,但克隆比较简单时候。
原型模式可扩展为:
带原型管理器的原型模式,它在原型模式的基础上增加了一个原型管理器PrototypeManager类。
第3章创建型模式(下)
3.1工厂方法模式
3.2抽象工厂模式
3.3建造者模式
1、单选择题
1.(B)2.(A)3.(C)4.(C)5.(D)
6.(C)7.(B)8.(A)9.(A)10.(A)
2、多选择题
1.(A、B、C、D)2.(A、B、C、D)3.(A、C)
3、填空题
1.工厂方法、抽象工厂
1.简单工厂
2.抽象工厂(AbstractFactory)、具体工厂(ConcreteFactory)、抽象产品
(Product)
3.工厂方法、多个等级的产品
4.抽象建造者(Builder)、具体建造者(ConcreteBuilder)、指挥者(Director)
五、简答题
1.答:
工厂模式的最大好处是增加了创建对象时的封装层次。
如果你使用工厂来创建对象,之后你可以使用更高级和更高性能的实现来替换原始的产品实现或类,这不需要在调用层做任何修改。
应用场合是常常有新的对象类型要被添加进来,但你所关心的仅仅是方法的接口,不关心其实现细节,本书中已经详细地介绍了其好处和应用环境。
2.答:
工厂方法模式的主要优点有:
1)用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;2)在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无需对原工厂进行任何修改,满足开闭原则。
其缺点是:
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
3.答:
工厂方法模式中考虑的是一类产品的生厂,如:
电视机工厂;而抽象工厂模式考虑多类产品的生产,如:
电器工厂。
工厂方法模式通常适用以下场景:
1)客户只知道创建产品的工厂名,而不知道具体的产品名。
如:
TCL电视工厂、海信电视工厂等;2)创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
3)客户不关心创建产品的细节,只关心产品的品牌。
抽象工厂模式通常适用以下场景:
1)当需要创建的对象是一系列相互关联或相互依赖的产品族时,如:
电器工厂中的电视机、洗衣机、空调等;2)系统中有多个产品族,但每次只使用其中的某一族产品。
如:
有的粉丝只喜欢穿李宁牌的衣、裤和鞋;3)系统中提供
了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。
4.答:
产品的种类称为产品等级,而一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。
5.答:
建造者模式的定义:
指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
该模式的主要优点是:
1)各个具体的建造者相互独立的,有利于系统的扩展;2)客户端不必知道产品内部组成的细节,便于控制细节风险。
其缺点是:
1)产品的组成部分必须相同,这限制了其使用范围;2)如果产品的内部变化复杂,该模式会增加很多的建造者类。
建造者模式通常在以下场合使用:
1)创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的;2)创建复杂对象的算法独立于该对象的
组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。
六、编程题
说明:
1-5编程题可参考本章节的实例自己实现。
第4章结构型模式(上)
4.2代理模式
4.3适配器模式
4.4桥接模式
1、单选择题
1.(A)2.(A)3.(D)4.(B)5.(A)
6.(C)7.(D)
2、多选择题
1.(A、D)2.(A、B、D)3.(A、C、D)4.(A、B、C)
3、填空题
1.适配器(Adapter)模式、桥接(Bridge)模式、装饰(Decorator)模式、外观(Facade)模式、享元(Flyweight)模式
2.真实主题(RealSubject)类、代理(Proxy)类
3.动态代理模式
4.继承、组合/聚合
5.适配者(Adaptee)类、适配器(Adapter)类
6.桥接
7.适配器
4、程序分析题
解:
1)本题使用了代理器模式;2)其参考结构图如下所示:
五、简答题
1.答:
代理(Proxy)模式:
为某对象提供一种代理以控制对该对象的访问。
即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
代理模式有以下的应用场景:
1)为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问时;2)要创建的目标对象开销很大时;3)控制不同种类客户对真实对象的访问权限时;4)当调用目标对象需要附加一些额外的处理功能时;5)为了提高系统的性能,需延迟对目标的加载时。
2.答:
代理模式的主要优点有:
1)代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;2)代理对象可以扩展目标对象的功能;3)代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度。
其主要缺点是:
1)在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢;2)增加了系统的复杂度。
3.答:
远程代理:
这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。
例如用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问它实际访问的是网盘空间。
虚拟代理:
这种方式通常用于要创建的目标对象开销很大时。
比如下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,消除用户对服务器慢的感觉。
安全代理:
这种方式通常用于控制不同种类客户对真实对象的访问权限。
4.答:
适配器模式(Adapter)的定义如下:
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式分为类结构型模式和对象结构型模式2种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
Java例子可参考本章节相关实例设计。
5.答:
适配器模式通常适用以下场景:
1)以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致;2)使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。
应用实例可参考本章节相关实例设计。
6.答:
桥接模式的定义如下:
将抽象与实现分离,使他们可以独立的变化。
它是用组合关系代替继承关系来实现,从而降低了抽象和实现这2个可变维度的耦合度。
其优点是:
1)由于抽象与实现分离,所以扩展能力强;2)其实现细节对客户透明。
缺点是:
由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
六、综合题
1.解:
本题可使用适配器模式和抽象工厂模式,参考类图如下所示:
其中:
1)PlayerFactory为抽象工厂,MediaPlayerFactory和RealPlayerFactory是具体工厂;
2)MainWindow(主窗口)和PlayerList(播放列表)是两个抽象产品;
3)MediaPlayerWindow和RealPlayerWindow是两个具体产品,是对MainWindow的实现;
4)MediaPlayerList和RealPlayerList是两个具体产品,是对PlayerList的实现;
5)MediaPlayerWindow和MediaPlayerList由MediaPlayerFactory生产;
6)RealPlayerWindow和RealPlayerList由RealPlayerFactory生产;
7)MediaPlayerAPI是已有的API,充当适配者,供MediaPlayerWindow(适配器)和MediaPlayerList(适配器)调用。
8)RealPlayerAPI也是已有的API,充当适配者,供RealPlayerWindow(适配器)和RealPlayerList(适配器)调用。
第5章结构型模式(下)
5.1装饰模式
5.2外观模式
5.3享元模式
5.4组合模式
1、单选择题
1.(D)2.(D)3.(B)4.(C)5.(B)
6.(C)7.(D)8.(A)9.(B)10.(C)
2、多选择题
1.(A,B,C,D)2.(B,C)3.(A、B)4.(A、B、C)
5.(A、B、C、D)6.(A,B)7.(C,D)
3、填空题
1.抽象构件(Component)、具体构件(ConcreteComponent)、抽象装饰(Decorator)2.迪米特3.内部状态、外部状态
4.单纯、复合5.结构型、创建型
6.透明式、安全式
四、程序分析题
1.解:
本题使用了享元模式,参考类图如下所示:
2.解:
1)本题使用了享元模式。
2)其参考程序代码如下所示:
importjava.util.*;publicclassWareFactory{privateArrayListWares=newArrayList();privateinttotalNum=0;
publicWareFactory()
{
KitchenWarend1=newbowl("饭碗");
Wares.add(nd1);
KitchenWarend2=newcup("杯子");
Wares.add(nd2);
}
publicKitchenWaregetKitchenWare(Stringtype)
{
if(type.equalsIgnoreCase("饭碗"))
{
totalNum++;
return(KitchenWare)Wares.get(0);
}
elseif(type.equalsIgnoreCase("杯子"))
{
totalNum++;
return(KitchenWare)Wares.get
(1);
}
else{returnnull;}
}
publicintgetTotalWare(){returnWares.size();}publicintgettotalNum(){returntotalNum;}
}publicinterfaceKitchenWare{publicStringgetType();publicvoiduse();
}publicclassbowlimplementsKitchenWare{privateStringtype;
publicbowl(Stringtype){this.type=type;}publicStringgetType(){returnthis.type;}
publicvoiduse(){System.out.println("使用的厨具是:
"+this.type);}
}publicclasscupimplementsKitchenWare{privateStringtype;
publiccup(Stringtype){this.type=type;}publicStringgetType(){returnthis.type;}publicvoiduse(){System.out.println("使用的厨具是:
"+this.type);}
}
publicclassClient2010{
publicstaticvoidmain(String[]args){
KitchenWarekw1,kw2,kw3,kw4;
WareFactorydf=newWareFactory();kw1=df.getKitchenWare("饭碗");kw1.use();
kw2=df.getKitchenWare("饭碗");kw2.use();
kw3=df.getKitchenWare("杯子");kw3.use();
kw4=df.getKitchenWare("杯子");kw4.use();
System.out.println("厨具种类:
"+df.getTotalWare());
System.out.println("生成的厨具数:
"+df.gettotalNum());
}
}
五、简答题
1.答:
装饰模式增加强了单个对象的能力。
JavaIO到处都使用了装饰模式,经典的例子就是Buffered系列类如BufferedReader和BufferedWriter,它们增强了Reader和
Writer对象,以实现提升性能的Buffer层次的读取和写入。
2.答:
装饰模式是一种用于替代继承的技术,它使用对象之间的关联关系来取代类之间的继承关系。
当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式。
在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能。
这些都不用改变原有对象,满足开闭原则。
3.答:
外观模式的定义:
是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。
其主要优点有:
1)降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响到调用它的客户类;2)对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易;3)降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响到外观对象。
其主要缺点是:
1)不能很好地限制客户使用子系统类;2)增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
其应用场景有:
1)对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系;2)对于一个复杂系统,其子系统很多,外观模式可以为系统设计一个简单的接口供外界访问;3)当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。
4.答:
享元工厂角色负责创建和管理享元角色。
当客户对象请求一个享元对象时,享元工厂检查系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象,它是工厂模式在享元模式中的应用。
5.答:
组合模式包含抽象构件(Component)角色、树叶构件(Leaf)角色、树枝构件
(Composite)角色。
它分为透明式的组合模式和安全式的组合模式2种。
安全组合模式的类图如下:
第6章行为型模式(上)
6.2模板方法模式
6.3策略模式
6.4命令模式
1、单选择题
1.(A)2.(D)3.(C)4.(B)5.(A)
6.(B)7.(D)8.(A)9.(B)
2、多选择题
1.(B,C,D)2.(A,B,D)3.(A,