软件设计模式JAVA习题答案.docx

上传人:b****4 文档编号:24361437 上传时间:2023-05-26 格式:DOCX 页数:31 大小:585.22KB
下载 相关 举报
软件设计模式JAVA习题答案.docx_第1页
第1页 / 共31页
软件设计模式JAVA习题答案.docx_第2页
第2页 / 共31页
软件设计模式JAVA习题答案.docx_第3页
第3页 / 共31页
软件设计模式JAVA习题答案.docx_第4页
第4页 / 共31页
软件设计模式JAVA习题答案.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

软件设计模式JAVA习题答案.docx

《软件设计模式JAVA习题答案.docx》由会员分享,可在线阅读,更多相关《软件设计模式JAVA习题答案.docx(31页珍藏版)》请在冰豆网上搜索。

软件设计模式JAVA习题答案.docx

软件设计模式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,B,C)4、(A,B,C,D)

3、填空题

1.行为型模式

2.模板方法

3.抽象方法、具体方法、钩子方法

4.策略

5.简单工厂

6.命令

4、简答题

1.答:

行为型模式用于描述程序在运行时

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1