设计模式考点.docx
《设计模式考点.docx》由会员分享,可在线阅读,更多相关《设计模式考点.docx(25页珍藏版)》请在冰豆网上搜索。
![设计模式考点.docx](https://file1.bdocx.com/fileroot1/2023-6/19/17f5966f-621a-4ba2-a321-2d1fea8f621d/17f5966f-621a-4ba2-a321-2d1fea8f621d1.gif)
设计模式考点
设计模式题库--自编版
选择题
1、设计模式具有()的优点。
A、提高系统性能B、降低软件规模和复杂度
C、减少代码开发工作量D、提升软件设计的质量
在面向对象软件的开发中,采用设计模式()。
可以减少在设计和过程中需要创建的实例对象的数量
可以保证程序的运行速度达到最优值
可以复用相似问题的相同解决方案
允许在非面向对象程序设计语言中使用面向对象的概念
()都是行为型设计模式。
组合模式、适配者模式和代理模式
观察者模式、职责链模式和策略模式
原型模式、建造者模式和单例模式
迭代器模式、命令模式和桥接模式
4.开闭原则是面向对象的可复用设计的基石,开闭原则是指一个软件实体应当对()开放,对()关闭;里氏代换原则是指任何()可以出现的地方,()一定可以出现;依赖倒置原则就是依赖于(),而不要依赖于(),或者说要针对接口编程,不要针对实现编程。
①A、修改B、扩展C、分析D、设计
②A、修改B、扩展C、分析D、设计
③A、变量B、常量C、基类对象D、子类对象
④A、变量B、常量C、基类对象D、子类对象
⑤A、程序设计语言B、建模语言C、实现D、抽象
⑥A、程序设计语言B、建模语言C、实现D、抽象
5.关于单一责原则,以下叙述错误的是()。
一个雷只负责一个功能领域中的相应职责。
就一个类而言,应该有且仅有一个引起它变化的原因。
一个类承担的职责越多,越容易复用,被复用的可能性越大。
当一个类承担的职责过多时,需要将职责进行分离,将不同的职责封装在不同的类中。
6.以下关于面向对象设计的的叙述中,错误的是()。
高层模块不应该依赖于低层模块。
抽象不应该依赖于细节。
细节可以依赖于抽象。
高层模块无法不依赖于低层模块。
7.在系统设计中应用迪米特法则,以下叙述有误的是()。
在类的划上,一个尽量创建松耦合的类,类的耦合度越低,复用越容易。
如果两个类之间不必彼此直接通信,那么这两个类就不应该发生直接的相互作用。
在对其他类的引用上,一个对象对其他对象的引用应该降到最低。
在类的设计上,只要有可能,一个类型应该尽量设计成抽象类或接口,且成员变量和成员函数的访问权限最好设置为公开的。
8.在简单工厂模式中,如果需要增加新的具体产品,通常需要修改()的源代码。
A、抽象产品类B、其他具体产品类C、工厂类D、客户类
9.以下关于简单工厂模式叙述错误的是()。
A、简单工厂模式可以根据参数的不同返回不同的产品类的实例。
B、简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
C、简单工厂模式可以减少系统中的类的个数,简化系统的设计,使得系统更易于理解。
D、系统的扩展困难,在添加新的产品时需要修好工厂的业务逻辑,违背了开闭原则。
10.以下代码使用了()模式。
abstractclassProduct
{
publicabstractvoidProcess();
}
classConcreateProductB:
Product
{
PublicoverridevoidProcess()
...
}
ClassFactory
{
PublicstaticProductCreateProduct(chartype)
{
Switch(type)
{
Case‘A’:
ReturnnewConcreateProductA();
break;
Case‘B’:
ReturnnewConcreateProductB();
break;
}
}
}
SimpleFactoryB、FactoryMethod
C、AbstractFactoryD、未使用任何设计模式
11.不同品牌的手机应该由不同是公司所造,例如Motorola公司生产Motorola手机,Nokia公司生产Nokia手机。
该场景蕴含了()模式。
A、SimpleFactoryB、FactoryMethodC、AbstractFactoryD、Builder
12.以下关于工厂方法模式的叙述错误的是()。
在工厂方法模式中引入了抽象工厂类,二具体产品的场景延迟到具体工厂中实现
使用工厂方法模式添加新的产品对象很容易,无须对原有系统进行修改,符合开闭原则
工厂方法模式存在的问题是在添加新产品时,需要编写新的具体产品类,而且提供与之对应的具体工厂类,随着类个数的增加,会给系统带来一些额外开销。
工厂方法模式是所有形式的工厂模式中的最为抽象和最具一般性的一种形态,工厂方法模式退化后可以演变成抽象工厂模式。
13.某银行系统采用工厂模式描述其不同账户之间的关系,设计出的类图如图4-7所示。
其中,与工厂模式中的“Creator”角色相对应的类是();与“Product”角色相对应的类是()。
①A、BankB、AccountC、CheckingD、Savings
②A、BankB、AccountC、CheckingD、Savings
14、关于C#中的MemberwiseClone()方法,以下叙述有误的是()。
A、对于对象x,都有()==x
B、对于对象x,都有().GetType()==()
C、对于对象x的成员对象Member,都有
().Menber==
D、对于对象x的成员对象Member,都有
().()==以下关于原型模式叙述错误的是()。
原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象
浅克隆仅仅复制所考虑的对象,而不复制它所引用的对象,也就是其中的成员对象并不复制
在原型模式中实现深克隆时通常需要编写较为复杂的代码
在原型模式中不需要为每一个类配备一个克隆方法,因此对于原型模式的扩展很灵活,对于已有类的改造也较为容易
16.某公司要开发一个即时聊天软件,用户在聊天过程中可以与多位好友同时聊天,在私聊时将产生多个聊天窗口,为了提高聊天窗口的创建效率,要去根据第一个窗口快速创建其他窗口。
针对这种需求,采用()进行设计最为合适。
享元模式B、单例模式C、原型模式D、组合模式
17.在()时可使用单例模式。
隔离菜单项对象的创建和使用
防止一个资源管理器窗口被实例化多次
使用一个已有的查找算法而不想修改既有代码
不能创建子类,需要扩展一个数据过滤器
18.以下关于单例模式的描述,正确的是()。
它描述了只有一个方法的类的集合
它能够保证一个类只产生一个唯一的实例
它描述了只有一个属性的类的集合
它能够保证一个类的方法只能被一个唯一的类调用
19.以下()不是单例模式的要点。
某个类只能有一个实例
单例类不能被继承
必须自行创建单个实例
必须自行向整个系统提供单个实例
20、()将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
A、命令(Command)模式B、适配器(Adapter)模式
C、策略(Strategy)模式D、单例(Simple)模式
21.以下关于适配器模式的叙述错误的是()。
适配器模式将一个接口装换成客户希望的另一个接口,使得原本由于接口不兼容那些类可以一起工作。
在类适配器中,Adapter和Adaptee是继承关系,而在对象适配器中,Adapter和Adaptee是关联关系。
类适配器比对象适配器更加灵活,在C#语言中可以通过类适配器一次视频多个适配者类。
适配器可以在不修改原来的适配者接口Adaptee的情况下将一个类的接口和另一个类的接口匹配起来。
22.现需要开发一个文件转换软件,将文件由一种格式转换为另一种格式,例如将XML文件转换为PDF文件,将DOC文件转换为TXT文件,有些文件格式转换代码已经存在,为了将已有的代码应用于新软件,而不需要修改软件的整体结构,可以使用()模式进行系统设计。
适配器(Adapter)B、组合(Composite)
C、外观(Faced)D、桥接(Bridge)
23.在对象适配器模式中,适配器类(Adapter)和适配者类(Adaptee)之间的关系为()。
关联关系B、依赖关系C、继承关系D、实现关系
24.()模式将抽象部分与它的实现部分相分离,使它们都可以独立地变化。
图10-7所示为该模式的图,其中,()用于定义实现部分的接口。
①A、单例(Simple)B、桥接(Bridge)C、组合(Composite)D、外观(Faced)
②A、AbstractionB、ConcreteImplementorA
C、ConcreteImplementorBD、Implementor
25.以下关于桥接模式的叙述错误的是()。
桥接模式的用意是将抽象化与实现化解耦,使得亮着可以独立地变化。
桥接模式将继承关系转换成关联关系,从而降低系统的耦合度。
桥接模式来源动态地给一个对象增加功能,这些功能也可以动态的撤销。
桥接模式可以从接口中分离实现功能,使得设计更具有扩展性。
26.()不是桥接模式所适用的环境。
一个可以跨平台并支持多种格式的文件编辑器
一个支持多数据源的报表生成工具,可以以不同的图形方式显示报表信息
一个可动态选择排序算法的数据操作工具
一个支持多种编程语言的跨平台开发工具
27.当不能采用生成子类的方法进行扩展时,可采用()模式动态地给一个对象添加一些额外的职责。
A、外观(Faced)B、单例(Simple)C、参与者(Participant)D、装饰(Decorator)
以下()不是装饰模式的适用条件。
要扩展一个类的功能或给一个类增加附加责任
要动态地给一个对象增加功能,这些功能还可以动态撤销
要动态组合多于一个的抽象化角色和实现化角色
要通过一些基本功能的组合产生复杂功能,而不使用继承关系
操作系统中的应用程序快捷方式是()模式的应用实例。
A、代理(Proxy)B、组合(Composite)C、装饰(Decorator)D、外观(Faced)
以下关于代理模式的叙述错误的是()。
代理模式能够协调调用者和被调用者,从而在一定程度上降低系统的耦合度
控制对一个对象的访问,给不同的用户提供不同级别的使用权限时可以考虑使用远程代理
代理模式的缺点是请求的处理速度会变慢,并且实现代理模式需要额外的工作
代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用
29.代理模式有多种类型,其中,智能引用代理是指()。
为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果
保护目标不让恶意用户接近
使几个用户能够同时使用一个对象而没有冲突
当一个对象被引用时,提供一些额外的操作,例如将此对象被调用的次数记录下来
30.以下关于命令模式的叙述错误的是()。
命令模式将一个请求封装为一个对象,从而可以用不同的请求对客户进行参数化
命令模式可以将请求发送至和请求接受者解耦
使用命令模式会导致某些系统有过多的具体命令类,导致在有些系统中命令模式变得不切实际
命令模式是对命令的封装,命令模式把发出命令的责任和执行命令的责任机制在同一个类中,委派给同意的类来进行处理
31.在()时无需使用命令模式。
实现撤销操作和恢复操作
将请求的发送者和接收者解耦
不改变聚合类的前提下定义作用于聚合中元素的新操作
不同的时间指定请求,并将请求排队
32.()模式定义了对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
适配器(Adapter)B、迭代器(Iterator)
C、原型(Prototype)D、观察者(Observer)
33.在观察者模式中,()。
一个Subject对象可对应多个Observer对象
Subject只能有一个ConcreteSubject子类
Observer只能有一个ConcreteObserver子类
一个Subject对象必须至少对应一个Observer对象
34.下面这句话隐含了()模式。
我和妹妹跟妈妈说:
“妈妈,我和妹妹在院子里玩。
饭做好了叫我们一声。
”
适配器B、职责链C、观察者D、迭代器
简答题
什么是设计模式,它包含那些基本要素
设计模式是一套反复使用的、多数人知晓、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且提高代码的可靠性。
设计模式是一种用于对软件系统中不断重现的设计问题的解决方案进行文档化的技术,也是一种共享专家设计经验的技术。
设计模式的基本要素:
模式名称、问题、目的、解决方案、效果、实例代码、相关设计模式(其中有4个关键要素:
模式名称、问题、解决方案、效果)
设计模式如何分类,每一类设计模式有何优点
(1)根据目的可分为创建型,结构型和行为型;
创建型模式主要用于创建对象
结构型模式主要用于处理类或对象的组合
行为型模式主要用于描述类或对象如何交互和怎样分配职责
(2)根据范围,即模式主要是处理类之间的关系还是处理对象之间的关系,可分为类模式和对象模式;
类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是一种静态关系
对象模式处理对象间的关系,这些关系在运行时变化,更具动态性
设计模式具有哪些优点
(1)融合了众多专家的经验,并以一种标准的形式供广大开发人员所用
(2)提供了一套通用的设计词汇和一种通用的语言,以方便开发人员之间进行沟通和交流,使得设计方案更加通俗易懂
(3)让人们可以更加简单方便地复用成功的设计和体系结构
(4)使得设计方案更加灵活,且易于修改
(5)将提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本
(6)有助于初学者更深入地理解面向对象思想,方便阅读和学习现有类库与其他系统中的源代码,还可以提高软件的设计水平和代码质量
常见的设计模式有哪些优点
简单工厂模式:
(1)实现了对象创建和使用的分离;
(2)客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可;
工厂方法模式:
(1)工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节;
(2)能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部;(3)在系统中加入新产品时,完全符合开闭原则;
单例模式:
(1)提供了对唯一实例的受控访问;
(2)可以节约系统资源,提高系统的性能;
原型模式:
(1)简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率
扩展性较好;
(2)提供了简化的创建结构,原型模式中产品的复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品;(3)可以使用深克隆的方式保存对象的状态,以便在需要的时候使用,可辅助实现撤销操作;
适配器模式:
(1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构;
(2)增加了类的透明性和复用性,提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用;(3)灵活性和扩展性非常好;
装饰模式:
(1)对于扩展一个对象的功能,装饰模式比继承更加灵活,不会导致类的个数急剧增加;
(2)可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的具体装饰类,从而实现不同的行为;(3)可以对一个对象进行多次装饰;(4)具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,且原有类库代码无须改变,符合开闭原则;
代理模式:
(1)能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;
(2)客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性;
桥梁模式:
(1)需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系;
(2)抽象部分和实现部分可以以继承的方式独立扩展而互不影响;(3)一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统;
观察者模式:
(1)可以实现表示层和数据逻辑层的分离;
(2)在观察目标和观察者之间建立一个抽象的耦合;(3)支持广播通信,简化了一对多系统设计的难度;(3)符合开闭原则,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便;
命令模式:
(1)降低了系统的耦合度;
(2)新的命令可以很容易地加入到系统中,符合开闭原则;(3)可以比较容易地设计一个命令队列或宏命令(组合命令);(4)为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案;
透明与半透明模式
透明模式:
客户端完全对抽象编程;
半透明模式:
使用具体装饰类型定义装饰之后的类,而具体构件可以继续使用抽象构件类型来定义;不可以实现对同一个对象的多次修饰。
设计原则的概念(前四个)、优点。
单一职责原则:
一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
优点:
(1)类的复杂度降低,实现什么职责都有清晰明确的定义;
(2)可读性提高;复杂度降低,那当然可读性提高了;(3)可维护性提高,可读性提高,那就更容易维护了;(4)变更引起的风险降低;也就是说提高了扩展性和可维护性
开闭原则:
软件实体应当对扩展开放,对修改关闭。
优点:
方便对系统进行扩展,在扩展时无需修改代码,提高系统的稳定性和延续性。
里士代换原则:
所有引用基类的地方必须能透明地使用其子类的对象。
优点:
运行时,子类实例替换父类实例,可以很方便地扩展系统的功能,无须修改原有子类的代码,增加一个新的功能可以通过增加一个新的子类来实现。
依赖倒转原则:
高层模块不应该依赖低层模块,它们都应该依赖抽象。
抽象不应该依赖于细节,细节应该依赖于抽象。
优点:
系统具有很好的灵活性,当系统行为发生变化,只需要对抽象层进行扩展,在不修改的情况下来扩展系统的功能。
7.浅克隆与深克隆的区别
浅克隆:
当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制;
深克隆:
除了对象本身被复制外,对象所包含的所有成员变量也将被复制;
8.分析理解饿汉式和懒汉式单例的异同。
共同点:
饿汉式单例类和懒汉式单例类的构造函数都是私有的。
饿汉式单例类:
无须考虑多个线程同时访问的问题;调用速度和反应时间优于懒汉式单例;资源利用效率不及懒汉式单例;系统加载时间可能会比较长
懒汉式单例类:
实现了延迟加载;必须处理好多个线程同时访问的问题;需通过双重检查锁定等机制进行控制,将导致系统性能受到一定影响
9.什么是双重锁定为什么要进行双重锁定,JAVA中如何实现双重锁定。
定义:
是一种对单例对象创建进行控制的双重判断机制。
目的:
更好地对单例对象的创建进行控制。
实现过程:
在双重检查锁定中,当实例不存在且同时有两个线程调用GetInstance()方法时,它们都可以通过第一重“instance==null”判断,如果此时不进行“instance==null”判断,第二个线程并不知道实例已经创建,将会创建新的实例,还会产生多个单例对象,违背了单例模式的设计思想。
代码题
(简单工厂模式)使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果向造人的工厂方法传入参数“M”,则返回一个男人(Man)对象,如果传入参数“W”则返回一个女人(Woman)对象,绘制相应的类图并使用JAVA语言模拟实现该场景。
先需要增加一个新的机器人类,如果传入参数“R”则返回一个机器人(Robot)对象,对代码进行修改并注意女娲类的变化。
publicinterfacePerson{
publicvoidpersonmethod();
}
publicclassManPersonimplementsPerson{
publicvoidpersonmethod(){
"男人");
}
}
publicclassWomanPersonimplementsPerson{
publicvoidpersonmethod(){
"女人");
}
}
publicclassCreator{
publicstaticPersoncreateperson(Stringtype){
Personperson=null;
if("M")){
person=newManPerson();
}
elseif("W")){
person=newWomanPerson();
}
returnperson;
}
}
publicclassClient{
publicstaticvoidmain(String[]args){
Personperson;
person=("W");
();
}
}
(简单工厂方法)使用简单工厂方法模式设计一个可以创建一个不同几何形状,如圆形、矩形、三角形等绘图工具类,每个几何图形均具有绘制、擦除两个方法,要求在绘制不支持的集合图形时,抛出一个异常,绘制类图并使用JAVA语言编程模拟实现。
类似上面
(工厂方法模式)宝马(BMW)工厂制造宝马汽车,奔驰(Benz)工厂制造奔驰汽车。
使用工厂方法模式模拟场景,要求绘制相应的类图,并用JAVA语言编程模拟实现
publicinterfaceCreator{
publicProductfactory();
}
publicclassBMWCreatorimplementsCreator{
publicProductfactory(){
returnnewBMWProduct();
}
}
publicclassBenzCreatorimplementsCreator{
publicProductfactory(){
returnnewBenzProduct();
}
}
publicinterfaceProduct{
}
publicclassBenzProductimplementsProduct{
publicvoidBenzProduct(){
"奔驰被创造");
}
}
publicclassBMWProductimplementsProduct{
publicvoidBMWProduct(){
"宝马被创造");
}
}
publicclassClient{
publicstaticCreatorc1,c2;
publicstaticProductp1,p2;
publicstaticvoidmain(String[]args){
c1=newBenzCr