提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、面向对象设计——设计模式的分类
- 一、创建型模式
- 二、结构型模式
- 三、行为型模式
- 二、历年真题——面向对象设计模式分类
- 2009上半年
- 2009下半年
- 2010上半年
- 2010下半年
- 2011上半年
- 2011下半年
- 2012上半年
- 2012下半年
- 2013上半年
- 2013下半年
- 2014上半年
- 2014下半年
- 2015上半年
- 2015下半年
- 2016上半年
- 2016下半年
- 2017上半年
- 2017下半年
一、面向对象设计——设计模式的分类
一、创建型模式
设计模式 | 简要说明 | 关键字 |
---|---|---|
工厂方法(Factory Method) | 定义一个创建对象的接口, | 动态生产对象 |
抽象工厂模式(Abstract Factory) | 提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定他们具体的类 | 生产成系列对象 |
原型模式(Prototype) | 用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象 | 克隆对象 |
单例模式(Singleton) | 保证一个类只有一个实例,并提供一个访问的全局访问点 | 单实例 |
构建器模式(Builder) | 将一个复杂类的表示和构造相分离,使得相同的构建过程能够得出不同的表示 | 复杂对象构造 |
二、结构型模式
设计模式 | 简要说明 | 关键字 |
---|---|---|
适配器模式(Adapter) | 将一个类的接口转换成用户希望得到的另一种接口,使得原来不相容的接口得以协同工作 | 转换接口 |
桥接模式(Bridge) | 将一个类的抽象与实现分离开,使得他们可以独立的变化 | 继承树拆分 |
组合模式(Composite) | 将对象组合成树形结构,用以表示“整体-结构”的层次部分,使得用户对单个对象和组合对象的使用具有一致性 | 树形目录结构 |
装饰模式(Decorator) | 动态的给一个对象添加一些额外的职责 | 附加职责 |
外观模式(Facade) | 定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化了系统的使用 | 对外统一接口 |
享元模式(Flyweight) | 支持大量细粒度对象共享的有效方法 | 共享文字对象 |
代理模式(Proxy) | 为其他对象提供一种代理以控制这个对象的访问 |
三、行为型模式
设计模式 | 简要说明 | 关键词 |
---|---|---|
职责链模式(Chain of Responsibility) | 通过给多个对象处理请求的机会,减少请求的发送者与接收者之间的耦合,将接收对象连接起来,在链中传递请求,直到有一个对象处理这个请求 | 传递职责 |
命令模式(Command) | 将一个请求封装成一个对象,从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作 | 日志记录,可撤销 |
解释器模式(Interpreter) | 给定一种语言,定义它的文法解释,并定义一个解释器,该解释器用来根据文法表示来解释语言中的句子 | 虚拟机的机制 |
迭代器模式(Iterator) | 提供一种方法来顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示 | 数据库数据集 |
中介者模式(Mediator) | 用一个中介对象来封装一系列的对象交互,它使各对象不需要显式的相互调用,从而达到低耦合,还可以独立的改变对象间的交互 | 不直接引用 |
备忘录模式(Memento) | 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后将该对象恢复到原先保存的状态 | |
观察者模式(Observer) | 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新 | 联动 |
状态模式(State) | 允许一个对象在其内部状态改变时改变它的行为 | 状态变成类 |
策略模式(Strategy) | 定义一系列算法,把他们一个个封装起来,并且使他们之间可以相互替换,从而让算法可以独立于使用它的用户而变化 | 多方案切换 |
模板方法模式(Template Method) | 定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些特定的步骤 |
二、历年真题——面向对象设计模式分类
2009上半年
●当不适合采用生成子类的方法对己有的类进行扩充时,可以采用(43)设计模式动态地给一个对象添加一些额外的职责;
当应用程序由于使用大量的对象,造成很大的存储开销时,可以采用(44)设计模式运用共享技术来有效地支持大量细粒度的对象:;
当想使用一个已经存在的类,但其接口不符合需求时,可以采用(45)设计模式将该类的接口转换成我们希望的接口。
(43)A.命令(Command) B.适配器(Adapter)
==C.装饰(Decorate) == D.享元(Flyweight)
(44)A.命令(Command) B.适配器(Adapter)
C.装饰(Decorate) D.享元(Flyweight)
(45)A.命令(Command) B.适配器(Adapter)
C.装饰(Decorate) D.享元(Flyweight)
装饰模式(Decorator):采用装饰模式可以动态的给一个对象添加一些额外的职责
享元模式(Flyweight):享元模式运用共享技术有效的支持大量细粒度的对象
适配器模式(Adapter):将该类的接口转换成希望的接口
2009下半年
●采用(43)设计模式可保证一个类仅有一个实例;
采用(44)设计模式可将对象组合成树形结构以表示“部分-整体”的层次结构,使用户对单个对象和组合对象的使用具有一致性;
采用(45)设计模式可动态地给一个对象添加一些额外的职责。
(43)A.命令(Command) ==B.单例(Singleton) ==
C.装饰(Decorate) D.组合(Composite)
(44)A.命令(Command) B.单例 (Singleton)
C.装饰(Decorate) D.组合 (Composite)
(45)A.命令(Command) B.单例 (Singleton)
C.装饰(Decorate) D.组合 (Composite)
●下列UML类图表示的是(46)设计模式。该设计模式中,(47)。
(46)A.备忘录(Memento) B.策略(Strategy)
C.状态(State) D.观察者(Observer)
(47)A.一个Subject对象可对应多个Observer对象
B.Subject 只能有一个ConcreteSubject 子类
C.Observer 只能有一个ConcreteObserver 子类
D.一个Subject对象必须至少对应一个Observer对象
2010上半年
●下列UML类图表示的是(43)设计模式。关于该设计模式的叙述中,错误的是(44)。
(43)A.工厂方法 B.策略 C.抽象工厂 D.观察者
(44)A.提供创建一系列相关或相互依赖的对象的接口,而无需指定这些对象所属的具体类
B.可应用于一个系统要由多个产品系列中的一个来配置的时候
C.可应用于强调一系列相关产品对象的设计以便进行联合使用的时候
D.可应用于希望使用已经存在的类,但其接口不符合需求的时候
抽象工厂(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
使用情况:
①系统独立于产品的创建组合和表示
②系统由多个产品系列中的一个来配置
③强调一系列相关的产品对象的设计以便进行联合使用
④提供一个产品类库,只想显示接口而不是实现桥接模式(Bridge):希望使用已经存在的类,但其接口不符合需求
2010下半年
●下面的UML类图描绘的是(46)设计模式。关于该设计模式的叙述中,错误的是(47)。
(47)A.桥接 B.策略 C.抽象工厂 D.观察者
(48)A.该设计模式中的Observer需要维护至少一个Subject对象
B.该设计模式中的ConcreteObserver可以绕过Subject及其子类的封装
C.该设计模式中一个Subject对象需要维护多个Observer对象
D.该设计模式中Subject需要通知Observer对象其自身的状态变化
2011上半年
桥接模式(Bridge):将对象的抽象和实现分离,从而可以独立的改变他们
组合模式(Composite):
外观模式(Facade):用单个对象表示整个子系统
单例模式(Singleton):一个类只产生一个实例
●设计模式(44)将抽象部分与其实现部分相分离,使它们都可以独立地变化。下图为该设计模式的类图,其中,(45)用于定义实现部分的接口。
(44) A.Bridge(桥接) B.Composite (组合) C.Facade (外观)D.Singleton (单例)
(45)A.Abstraction B.ConcretelxnplementorA
C.ConcretelmplementorB D.Implementor
●以下关于Singleton (单例)模式的描述中,正确的是(46)。
(46)A.它描述了只有一个方法的类的集合
B.它描述了只有一个属性的类的集合
C.它能够保证一个类的方法只能被一个唯一的类调用
==D.它能够保证一个类只产生唯一的一个实例 ==
●(47)将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
(47)==A.Adapter (适配器)模式 == B.Command (命令)模式
C.Singleton (单例)模式 D.Strategy (策略)模式
2011下半年
●(40)设计模式允许一个对象在其状态改变时,通知依赖它的所有对象。该设计模式的类图如下图,其中,(41)在其状态发生改变时,向它的各个观察者发出通知。
(40)A.命令(Command) B.责任链(Chain of Responsibility)
C.观察者(Observer) D.迭代器(Iterator)
(41)A.Subject B.ConcreteSubject C.Observer D.ConcreteObserver
●欲动态地给一个对象添加职责,宜采用(43)模式。
(43)A.适配器(Adapter) B.桥接(Bridge)
C.组合(Composite) ==D.装饰器(Decorator) ==
●(44)模式通过提供与对象相同的接口来控制对这个对象的访问。
(44)A.适配器(Adapter) ==B.代理(Proxy) ==
C.组合(Composite) D.装饰器(Decorator)
2012上半年
●设计模式根据目的进行分类;可以分为创建型、结构型和行为型三种。其中结构型模式用于处理类和对象的组合。(44)模式是一种结构型模式。
(44)==A.适配器(Adapter) == B.命令(Command)
C.生成器(Builder) D.状态(State)
●设计模式中的(45)模式将对象组合成树形结构以表示“部分-整体”的层次结构, 使得客户对单个对象和组合对象的使用具有一致性。下图为该模式的类图,其中,(46) 定义有子部件的那些部件的行为;组合部件的对象由(47)通过Component提供的接口操作。
(45)A.代理(Proxy) B.桥接器(Bridge)
==C.组合(Composite) == D.装饰器(Decorator)
(46)A.Client B.Component C.Leaf D.Composite
(47)A.Client B.Component C.Leaf D.Composite
2012下半年
●每种设计模式都有特定的意图。(44)模式使得一个对象在其内部状态改变时通过调用另一个类中的方法改变其行为,使这个对象看起来如同修改了它的类。下图是采用该模式的有关TCP连接的结构图实例。该模式的核心思想是引入抽象类(45)来表 示TCP连接的状态,声明不同操作状态的公共接口,其子类实现与特定状态相关的行为。当一个(46)对象收到其他对象的请求时,它根据自身的当前状态做出不同的反应。
(44)A.适配器(Adapter) B.命令(Command)
C.访问者(Visitor) D.状态(State)
(45)A.TCPConnection B.state C.TCPState D.TCPEstablished
(46)A.TCPConnection B.state C.TCPState D.TCPEstablished
●欲使类A的所有使用者都使用A的同一个实例,应(47)。
(47)A.将A标识为final B.将A标识为abstract
C.将单例(Singleton)模式应用于A D.将备忘(Memento)模式应用于A
2013上半年
●(44)设计模式能使一个对象的状态发生改变时通知所有依赖它的监听者。
(45)设计模式限制类的实例对象只能有一个。
适配器(Adapter)设计模式可以用于(46)。
用于为一个对象添加更多功能而不使用子类的是(47)设计模式。
(44)A.责任链 B.命令 C.抽象工厂 D.观察者
(45)A.原型 B.工厂方法 ==C.单例 == D.生成器
(46)A.将已有类的接口转换成和目标接口兼容
B.改进系统性能
C.将客户端代码数据转换成目标接口期望的合适的格式
D.使所有接口不兼容可以一起工作
(47)A.桥接 B.适配器 C.组合 D.装饰器
2013下半年
●(44)设计模式定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。这一模式使得算法可独立于它的客户而变化。
(44)A.策略(Strategy) B.抽象工厂(Abstract Factory)
C.观察者(Visitor) D.状态(State)
●在发布-订阅(Publish-Subscribe)消息模型中,订阅者订阅一个主题后,当该主题有新消息到达时,所有订阅者都会收到通知。(45)设计模式最适合这一模型。
(45)A.适配器(Adapter) B.通知(Notifier)
C.状态(State) D.观察者(Observer)
●下图所示为(46)设计模式,适用于:(47)。
(46)A.组件(Component) B.适配器(Adapter)
C.组合(Composite) D.装饰器(Decorator)
(47)A.表示对象的部分-整体层次结构
B.不希望在抽象和它的实现部分之间有一个固定的绑定关系
C.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
D.使所有接口不兼容类可以一起工作
2014上半年
●下图所示为(44)设计模式,适用于(45)。
(44)A.适配器(Adapter) B.责任链(Chain of Responsibility)
==C.外观( Facade) == D.桥接(Bridge)
(45)A.有多个对象可以处理一个请求,在运行时刻自动确定由哪个对象处理
B.想使用一个已经存在的类,而其接口不符合要求
C.类的抽象和其实现之间不希望有一个固定的绑定关系
D.需要为一个复杂子系统提供一个简单接口
●下列设计模式中,(46)模式既是类结构型模式,又是对象结构型模式。此模式与(47)模式类似的特征是,都给另一个对象提供了一定程度上的间接性,都涉及到从自身以外的一个接口向这个对象转发请求。
(46)A.桥接(Bridge) ==B.适配器( Adapter) ==
C.组成( Composite) D.装饰器(Decorator)
(47)A.桥接(Bridge) B.适配器( Adapter)
C.组成( Composite) D.装饰器( Decorator)
2014下半年
●一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。采用(43)模式,用一个中介对象来封装一系列的对象交互,从而使各对象不需要显式地相互引用,使其耦合松散,。而且可以独立地改变它们之间的交互。此模式与(44)模式是相互竞争的模式,主要差别是:前者的中介对象封装了其它对象间的通信,而后者通过引入其它对象来分布通信。
(43)A.解释器(Interpreter) B.策略(Strategy)
==C.中介者(Mediator) == D.观察者(Observer)
(44)A.解释器(Interpreter) B.策略(Strategy)
C.中介者(Mediator) D.观察者(Observer)
●图所示为(46)设计模式,适用于(47)。
(46)A.抽象工厂(Abstract Factory) B.生成器(Builder)
C.工厂方法(Factory Method) D.原型(Prototype)
(47)A.一个系统要由多个产品系列中的一个来配置时
B.当一个类希望由它的子类来指定它所创建的对象时
C.当创建复杂对象的算法应该独立于该对象的组成部分及其装配方式时
D.当一个系统应该独立于它的产品创建、构成和表示时
2015上半年
●下图所示为(44)设计模式,属于(45)设计模式,适用于(46)。
(44)A.代理(Proxy) B.生成器(Builder) == C.组合(Composite)== D.观察者(Observer)
(45)A.创建型 B.结构型 C.行为 D.结构型和行为
(46)A.表示对象的部分一整体层次结构时
B.当一个对象必须通知其它对象,而它又不能假定其它对象是谁时
C.当创建复杂对象的算法应该独立于该对象的组成部分及其装配方式时
D.在需要比较通用和复杂的对象指针代替简单的指针时
●某些设计模式会引入总是被用作参数的对象。例如(47)对象是一个多态accept 方法的参数。
(47)==A.Visitor == B.Command C.Memento D.Observer
2015下半年
●以下关于Singleton(单例)设计模式的叙述中,不正确的是(44)。
(44)A.单例模式是创建型模式
B.单例模式保证一个类仅有一个实例
C.单例类提供一个访问唯一实例的全局访问点
D.单例类提供一个创建一系列相关或相互依赖对象的接口
●(45)设计模式能够动态地给一个对象添加一些额外的职责而无需修改此对象的结构;(46)设计模式定义一个用于创建对象的接口,让子类决定实例化哪一个类;欲使一个后端数据模型能够被多个前端用户界面连接,采用(47)模式最适合。
(45)A.组合(Composite) B.外观(Facade) C.享元(Flyweight) D.装饰器(Decorator)
(46)A.工厂方法(Factory Method) B.享元(Flyweight)
C.观察者( Observer) D.中介者(Mediator)
(47)A.装饰器(Decorator) B.享元(Flyweight) C.观察者(Observer) D.中介者(Mediator)
2016上半年
●为图形用户界面(GUI)组件定义不同平台的并行类层次结构,适合采用(44)模式。
(44)A.享元(Flyweight) B.抽象工厂(Abstract Factory)
C.外观(Facade) D.装饰器(Decorator)
外观模式为子系统中的各类提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用,它是为子系统中的一组接口所提供的一个一致的界面。
●(45)设计模式将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
(45)A.命令(Command) B.责任链(Chain of Responsibility)
C.观察者(Observer) D.策略(Strategy)
●(46)设计模式最适合用于发布/订阅消息模型,即当订阅者注册一个主题后,此主题有新消息到来时订阅者就会收到通知。
(46)A.适配器(Adapter) B.通知(Notifier) C.观察者(Observer) D.状态(State)
●因使用大量的对象而造成很大的存储开销时,适合采用(47)模式进行对象共享,以减少对象数量从而达到较少的内存占用并提升性能。
(47)A.组合(Composite) B.享元(Flyweight) C.迭代器(Iterator) D.备忘(Memento)
2016下半年
●(44)模式定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换,使得算法可以独立于使用它们的客户而变化。以下(45)情况适合选用该模式。
①一个客户需要使用一组相关对象 ②一个对象的改变需要改变其它对象
③需要使用一个算法的不同变体 ④许多相关的类仅仅是行为有异
(44) A.命令(Command) B.责任链(Chain of Responsibility)
C.观察者(Observer) D.策略(Strategy)
(45)A.①② B.②③ ==C.③④ == D.①④
●(46)模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创 建不同的表示。以下(47)情况适合选用该模式。
①抽象复杂对象的构建步骤
②基于构建过程的具体实现构建复杂对象的不同表示
③一个类仅有一个实例
④一个类的实例只能有几个不同状态组合中的一种
(46)==A.生成器(Builder) == B.工厂方法(Factory Method)
C.原型(Prototype) D.单例( Singleton)
(47)A.①② B.②③ C.③④ D.①④
2017上半年
●下图所示为观察者(Obserrver)模式的抽象示意图,其中(44)知道其观察者,可以有任何多个观察者观察同一个目标;提供住处和删除观察者对象的接口。此模式体现的最主要的特征是(45)。
(44)A.Subject B.Observer ==C.ConcreteSubject == D.ConcreteObserver
(45)A.类应该对扩展开放,对修改关闭 B. 使所要交互的对象尽量松耦合
C. 组合优先于继承使用 D. 仅与直接关联类交互
●装饰器 (Decorator) 模式用于(46);外观 (Facade) 模式用于(47)。
①将一个对象加以包装以给客户提供其希望的另外一个接口
②将一个对象加以包装以提供一些额外的行为
③将一个对象加以包装以控制对这个对象的访问
④将一系列对象加以包装以简化其接口
(46)A.① B.② C.③ D.④
(47)A.① B.② C.③ D.④
2017下半年
●自动售货机根据库存、存放货币量、找零能力、所选项目等不同,在货币存入并进行选择时具有如下行为:交付产品不找零 :交付产品找零:存入货币不足而不提供任何产品;库存不足而不提供任何产品。这一业务需求适合采用(44)模式设计实现,其类图如下图所示,其中(45)是客户程序使用的主要接口,可用状态来对其进行配置。此模式为(46),体现的最主要的意图是(47)。
(44)A.观察者(Obeserver) B.状态(State)
C.策略(Stratehy) D.访问者(Visitor)
(45)A.VendingMachineState B.Buy
C.VendingDepositState D.VendingStockState
(46)A.创建型对象模式 B.结构型对象模式
C.行为型类模式 D.行为型对象模式
(47)A.当一个对象状态改变时所有依赖它的对象得到通知并自动更新
B.在不破坏封装性的前提下,捕获对象的内部状态并在对象之外保存
C.一个对象在其内部状态改变时改变其行为
D.将请求封装为对象从而可以使用不同的请求对客户进行参数化