java设计模式选择题复习题.docx
- 文档编号:10982192
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:28
- 大小:28.78KB
java设计模式选择题复习题.docx
《java设计模式选择题复习题.docx》由会员分享,可在线阅读,更多相关《java设计模式选择题复习题.docx(28页珍藏版)》请在冰豆网上搜索。
java设计模式选择题复习题
工厂系列模式的优缺点:
1.让用户的代码和某个特定类的子类的代码解耦
用户不必知道它所使用的对象是怎样创建的,只需知道该对象有哪些方法
2.抽象工厂模式可以为用户创建一系列相关的对象,使用户和创建这些对象的类脱耦
MVC模式是不是一种设计模式?
为什么
MVC不是设计模式,应该是框架/架构模式,因为它的定义是抽象的,没有足够的细节描述使你直接去实现,而只能根据MVC的概念和思想,用几个设计模式组合实现。
举出一个生活中使用装饰者模式的例子,用程序实现思路
举个生活中的例子,俗话说“人在衣着马在鞍”,把这就话用装饰者模式的语境翻译一下,“人通过漂亮的衣服装饰后,男人变帅了,女人变漂亮了;”。
对应上面的类图,这里人对应于ConcreteComponent,而漂亮衣服则对应于ConcreteDecorator;
设计模式如何分类,每一个类别都有什么特征?
设计模式分为3类,分别是:
创建型模式、行为型模式、结构型模式。
创建型特点:
避免用户直接使用new运算符创建对象。
行为型特点:
怎样合理的设计对象之间的交互通信,以及怎样合理的为对象分配职
结构型特点:
主要用于处理类或对象的组合
Javajdk中使用了哪些设计模式
1.单例2.静态工厂3.工厂方法4.抽象工厂5.构造者6.原型7.适配器8桥接9.组合10.装饰器11.外观12.享元14.代理15.迭代器16.观察者17.协调者18.模板方法19.策略20.责任链21.命令22.空对象25.解释器
面向对象的设计原则有哪些?
开闭原则、面向抽象的原则(依赖倒转原则)、多用组合少用继承原则、高内聚-低耦合原则。
观察者模式的推拉有什么不同?
使用场景
推,具体主题将变化后的数据全部交给具体观察者。
场景:
当具体主题认为具体观察者需要这些变换后的数据时,往往采用推数据方式;
拉,具体主题不将变化后的数据交给具体观察者,而是提供获得这些数据的方法。
场景:
当具体主题不知道具体观察者是否需要这些变换后的数据时,往往采用拉数据的方式。
策略模式和工厂模式有什么不同?
策略模式定义了一系列算法,将他们一个个封装,并且他们之间可以相互替换;
工厂模式定义一个创建对象的接口,让子类决定实例化哪一个类
5观察者模式的推拉有什么不同?
适用场景
现在要说的分歧在这里:
“推”的方式是指,Subject维护一份观察者的列表,每当有更新发生,Subject会把更新消息主动推送到各个Observer去。
“拉”的方式是指,各个Observer维护各自所关心的Subject列表,自行决定在合适的时间去Subject获取相应的更新数据。
“推”的好处包括:
1、高效。
如果没有更新发生,不会有任何更新消息推送的动作,即每次消息推送都发生在确确实实的更新事件之后,都是有意义的。
2、实时。
事件发生后的第一时间即可触发通知操作。
3、可以由Subject确立通知的时间,可以避开一些繁忙时间。
4、可以表达出不同事件发生的先后顺序。
缺点:
精确性较差,不能保证能把信息送到客户器。
“拉”的好处包括:
1、如果观察者众多,Subject来维护订阅者的列表,可能困难,或者臃肿,把订阅关系解脱到Observer去完成。
2、Observer可以不理会它不关心的变更事件,只需要去获取自己感兴趣的事件即可。
3、Observer可以自行决定获取更新事件的时间。
4、拉的形式可以让Subject更好地控制各个Observer每次查询更新的访问权限。
缺点:
不能够及时获取系统的变更。
6策略模式和工厂模式有什么不同?
一般情况下,策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。
可以应用的场景有优惠系统、工资计算系统等。
而工厂模式主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。
主要应用在多数据库选择,类库文件加载等。
很明显的是策略模式是开放的,作为一个主体你的活动范围是全程的,大多数事情要你自己亲力亲为。
而工厂模式作是封闭的,作为主体的你的活动范围是有限的,很多事情都帮组你做好了,你直接“点”就可以了。
7装饰者模式和适配器模式的比较
1.关于新职责:
适配器也可以在转换时增加新的职责,但主要目的不在此。
装饰者模式主要是给被装饰者增加新职责的。
2.关于原接口:
适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。
装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完成使用。
(增加新接口的装饰者模式可以认为是其变种--“半透明”装饰者)
3.关于其包裹的对象:
适配器是知道被适配者的详细情况的(就是那个类或那个接口)。
装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道。
8为什么要用设计模式,设计模式有哪些优点
设计模式的优点:
1、设计模式融合了众多专家的经验,并以标准的形式给广大群众使用,她提供了一中通用的设计词汇,和一种通用的设计语言,以方便开发人员之间开发和交流,使得设计方案更加通俗易懂;
2、设计模式使人们可以方便简单的复用设计模式;
3、设计模式是设计方案易于修改;
4、设计模式的使用将提高软件开发效率与质量,节约成本;
5、设计模式有助于初学者理解面向对象的思想。
9学过的每一种模式的适用场景和优缺点
职责链模式
优点:
1.将请求的发送者和接收者解耦
2.可以简化你的对象,因为它不需要知道链的结构
3.通过改变链内的成员或调动他们的次序,允许你动态地新增或删除责任
缺点:
1.并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端之外
2.可能不容观察运行时的特征,有碍于除错。
用途:
经常被使用在窗口系统中,处理鼠标和键盘之类的事件。
当算法牵涉到一种链型运算,而且不希望处理过程中有过多的循环和条件选择语句,并
且希望比较容易的扩充文法,可以采用职责链模式。
1)有多个对象处理请求,到底怎么处理在运行时确定。
2)希望在不明确指定接收者的情况下,向多个对象中的一个提交请求。
3)可处理一个请求的对象集合应该被动态指定。
典型例子:
一个请求发送给前台,前台表示我无权管理,将请求传递给财务部门,财务部门再……
简单工厂模式
优点:
工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。
而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
用途:
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
经典例子:
没啥好说的,这不是一个真正的设计模式
策略模式
优点:
1.提供了一种替代继承的方法,而且保持了继承的优点,比继承更独立(算法独立,可以任意扩展)
2.避免程序使用多重条件转移语句,使系统更灵活,并易于扩展
3.遵守大部分常用设计原则,高内聚,低耦合
缺点:
1.每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
可以使用工厂方法来解决。
用途:
各个不同地区不同的纳税方法,HF中不同鸭子的方法。
有多种鸭子,每个鸭子都有自己的行为,fly,quaak之类的。
行为有行为类,继承同一接口实现不同操作,以此实现算法互换。
装饰模式
优点:
1.装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
2.通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
3.有着比继承更加灵活的特性
缺点:
由于使用装饰模式,可以比使用继承关系需要较少数目的类。
使用较少的类,当然使设计比较易于进行。
但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。
更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
用途:
当需要给一个类添加新的行为的时候,但基于开闭原则,就使用装饰模式。
经典例子:
我穿衣服使用draw()方法,在我穿好衣服后,我还打算再寄领带,而寄领带就是装饰类,我们可以把装饰类和对象(穿衣服类)继承于同一个接口,在装饰类的draw()方法中调用super.draw(),然后再在这个方法里加上自己的特征。
工厂方法模式
优点:
1.良好的封装性,代码结构清晰。
一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用知道创建对象的艰辛过程,减少模块间的耦合。
2.工厂方法模式的扩展性非常优秀。
在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。
例如在我们的例子中,需要增加一个棕色人种,则只需要增加一个BrownHuman类,工厂类不用任何修改就可完成系统扩展。
3.屏蔽产品类。
这一特点非常重要,产品类的实现如何变化,调用者都不需要关心,它只需要关心产品的接口,只要接口保持不表,系统中的上层模块就不要发生变化,因为产品类的实例化工作是由工厂类负责,一个产品对象具体由哪一个产品生成是由工厂类决定的。
在数据库开发中,大家应该能够深刻体会到工厂方法模式的好处:
如果使用JDBC连接数据库,数据库从MySql切换到Oracle,需要改动地方就是切换一下驱动名称(前提条件是SQL语句是标准语句),其他的都不需要修改,这是工厂方法模式灵活性的一个直接案例。
4.工厂方法模式是典型的解耦框架。
高层模块值需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特原则,我不需要的就不要去交流;也符合依赖倒转原则,只依赖产品类的抽象;当然也符合里氏替换原则,使用产品子类替换产品父类,没问题!
缺点:
待补充
用途:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
JavaCollection中的iterator()方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
典型例子:
车子继承vehicle(车)类,有小汽车卡,公交车bus等,车子工厂实现工厂接口,工厂接口有抽象方法vehicleproducevehicle(Stringtype)方法,车子工厂中实现工厂方法vehicleproducevehicle(StringType),方法中根据需要new新的车子。
观察者模式
优点:
1. 观察者和被观察者之间是松耦合的,分别可以各自独立改变。
2.Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
3.遵守大部分GRASP原则和常用设计原则,高内聚、低耦合。
缺点:
1.松耦合导致代码关系不明显,有时可能难以理解。
2.如果一个对象被大量观察者订阅的话,在广播通知的时候可能会有效率问题。
(毕竟只是简单的遍历)
使用场景
1、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
经典例子:
看电视,天气预报
看新闻联播,观众们是观察者,新闻联播是对象,每个观察者都继承于一个统一的接口。
而被观察的对象是新闻联播,新闻联播可以添加新的观察者,或者当移除观察者(关电视不看),新闻联播对象有个通知用户信息变更方法,当达到某种条件是,新闻联播对象会将信息都通知给观察者。
抽象工厂模式
优点:
1.抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建
2.当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
3.增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”
缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
用途:
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
2、系统中有多于一个的产品族,而每次只使用其中某一产品族。
3、属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
经典例子:
抽象工厂在我的理解就是抽象工厂有两个或两个个以上的工厂方法模式结合,有一个工厂接口类,这个接口有中的产品家族有发动机和轮胎两个产品。
有两个具体工厂,米其林工厂和倍耐力工厂实现了抽象工厂。
米其林工厂生产的轮胎都继承于米其林轮胎,同理米其林发动机和倍耐力产品。
适配器模式
优点:
1.将目标类和适配者类解耦
2.增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
3.灵活性和扩展性都非常好,符合开闭原则
缺点:
一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。
用途:
想使用一个已经存在的类,但如果它的接口和你的要求不相同时。
可以使用适配器模式。
两个类所做的事情相同或相似,但接口不同时可以使用。
经典例子:
不同牌子电视机和不同牌子遥控器,里皮翻译用汉语布置恒大队员战术,不同牌子手机的软件。
球员都继承于中国人,都会说汉语,而里皮并不会说汉语。
在不知战术的时候,我们需要给里皮一个翻译,这个翻译就是里皮的适配器。
翻译可以和球员一样,也继承于中国人,也有说汉语这个方法。
而翻译认识里皮,翻译在说汉语()这个方法的时候,实际上是在说里面用意大利语的内容。
单例模式
优点:
1.实例控制,单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
2.灵活性,因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点:
1.可能的开发混淆,使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。
因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
2.不能解决删除单个对象的问题。
在提供内存管理的语言中(例如基于.NETFramework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。
在某些语言中(如C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
用途:
系统只需要一个实例的对象,而这个对象又会被经常创建。
典型例子:
数据库类里的Model,例如User,表单中显示用户信息会经常使用User.Update之类的方法,此时使用单例模式可以节省效率。
题号
题目
A
B
C
D
正确答案
1
抽象方法:
()
可以有方法体
可以出现在非抽象类中
是没有方法体的方法
抽象类中的方法都是抽象方法
C
2
设计模式的两大主题是()。
系统的维护与开发
对象组合与类的继承
系统架构与系统开发
系统复用与系统扩展
D
3
要依赖于抽象,不要依赖于具体。
即针对接口编程,不要针对实现编程,是()的表述
开-闭原则
依赖倒转原则
组合优于继承原则
继承优于组合原则
B
4
对于模式的表述错误的是()
模式其实就是解决某一类问题的方法论。
把解决某类问题的方法总结归纳到理论高度,那就是模式。
模式对问题的描述以及对问题的解答应具有高度的抽象性和代表性。
模式只是一个模型
D
5
设计模式具有的优点()。
选出最合适的一项。
适应需求变化
程序易于理解
减少开发过程中的代码开发工作量
简化软件系统的设计
A
6
Designpatternistoprogramas:
Metalistocar
Parkistotree
Blueprintistobuilding
MountainDewistosoda
C
7
对继承层次太深可能导致的问题的叙述不正确的是()。
继承层次太深导致紧内聚
继承层次太深导致弱内聚
继承层次太深导致紧耦合
继承层次太深会产生冗余,并使测试困难
A
8
在观察者模式中,表述错误的是()
观察者角色的更新是被动的。
被观察者可以通知观察者进行更新
观察者可以改变被观察者的状态,再由被观察者通知所有观察者依据被观察者的状态进行。
以上表述全部错误。
C
9
在Java中,下列关于方法重载的说法中错误的是()。
方法重载要求方法名称必须相同
重载方法的参数列表必须不一致
重载方法的返回类型必须一致
一个方法在所属的类中只能被重载一次
D
10
对观察者模式,以下叙述不正确的是()。
必须找出所有希望获得通知的对象。
所有的观察者对象有相同的接口。
如果观察者的类型相同,目标就可以轻易地通知它们。
在大多数情况下,观察者负责了解自己观察的是什么,目标需要知道有哪些观察者依赖自己。
A
11
关于模式适用性,在以下情况不适合使用CHAINOFRESPONSIBILITY(职责链)模式?
有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
在需要用比较通用和复杂的对象指针代替简单的指针的时候
你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
可处理一个请求的对象集合应被动态指定。
B
12
关于接口哪个正确?
()
实现一个接口必须实现接口的所有方法
一个类只能实现一个接口
接口间不能有继承关系
接口和抽象类是同一回事
A
13
Sun公司在设计java.io包中的类时使用了()模式。
装饰
策略
观察者模式
责任链模式
A
14
关于Java中的静态,下列说法错误的是()。
如果某些操作不依赖具体实例,那它就是静态的。
静态方法与类相关,与对象无关
需要创建一个对象来调用静态方法
静态方法是使用公共内存空间的
C
15
对象适配器模式是()原则的典型应用。
合成聚合复用原则
依赖倒转原则
接口回调
单一职责
A
16
如果在一个系统里面有许多类,它们之间的区别仅在于它们之间的行为,那么使用()模式可以动态地让一个对象在许多行为中选择一种行为。
装饰者模式
观察者模式
策略模式
以上都不对
C
17
以下对"开-闭"原则的一些描述错误的是?
"开-闭"原则与"对可变性的封装原则"没有相似性.
找到一个系统的可变元素,将它封装起来,叫"开-闭"原则
对修改关闭:
是其原则之一
从抽象层导出一个或多个新的具体类可以改变系统的行为,是其原则之一
A
18
Adapter(适配器)模式的意图是()。
希望简化现有系统的使用方法。
你需要定义自己的接口
将一个无法控制的现有对象与一个特定接口相匹配
将一组实现部分从另一组使用它们的对象中分离出来
你需要为特定的客户(或情况)提供特定系列的对象
B
19
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
这句话是对下列哪种模式的描述()。
Strategies
Adapter
Singleton
Decorator
C
20
下列关于开闭原则说法错误的是()。
将可变的元素封装起来,防止改变扩散到整个应用
通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。
已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。
最好将多个可变性都封装到一个抽象类或接口中
D
21
网站开发中的过滤器属于()模式。
策略
装饰者
观察者
责任链
D
22
关于抽象工厂模式,以下叙述不正确的是()
客户对象不需要知道向谁请求所需的对象和如何使用这些对象
抽象工厂类通过为每个不同类型的对象定义一个方法,来指定实例化哪个对象
具体工厂对象负责指定哪些对象要实例化
将抽象工厂模式和适配器模式结合在一起,可以将概念相似的对象当作同种对象处理
A
23
Whichofthefollowingprogramminglanguagesisbestsuitedtodesignpatterns?
Java
C
HTML
XML
A
24
在职责链模式里,很多对象由每一个对象对其()对象的引用而连接起来形成一条链。
下家
上家
周围
自身
A
25
系统中的文本显示类(TextView)和图片显示类(PictureView)都继承了组件类(Component),分别显示文本和图片内容,现需要构造带有滚动条、或者带有黑色边框、或者既有滚动条又有黑色边框的文本显示控件和图片显示控件,但希望最多只增加三个类,()设计模式可以实现该目的。
外观
装饰
单件
模板方法
B
26
面向对象系统中的“黑盒复用”是指()。
类继承
封装
对象组合
关联
C
27
Decorator模式的描述正确的是()。
该模式的意图是动态地给一个对象添加一些额外的职责。
就增加功能来说,该模式相比生成子类不够灵活。
适用于在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
该模式的意图是将对象组合成树形结构以表示“部分-整体”的层次结构。
该模式使得用户对单个对象和组合对象的使用具有一致性。
该模式适用性是你想表示对象的部分-整体层次结构。
B
28
java.util包中的Observable类相当于观察者模式中的()。
主题接口
具体主题
观察者接口
具体观察者
A
29
Java的异常处理机制可理解为哪一种设计模式。
观察者(Observer)模式
职责链(ChainofResponsibility)模式
策略(Strategy)模式
装饰者(Decorator)模式
B
30
如果我们的课程改变时间或地点,就应该通知所有选修了这门课程的同学。
这样的问题最好用什么模式来解决?
工厂模式
适配器模式
桥接模式
观察者模式
D
31
对象组合是通过获得()而在运行时刻动态定义的。
对象
对其它对象的引用
继承
构造函数
B
32
观察者模式有时被称作(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 设计 模式 选择题 复习题