设计模式六大基本原则:
“黑箱复用”——“B复用A的功能,但B无法看到A的内部细节”
“白箱复用”——“B复用A的功能,并且B可以了解A的内部细节”。
总体来说经典设计模式有23种,但不能说设计模式只有23种。 经典23种设计模式主要分为三大类:
为什么优先使用对象组合而不是类继承
因为继承会使类之间高度耦合,组合确实比继承更加灵活,也更有助于代码维护。
请举例说明你对创建型设计模式的理解
创建型模式分为5种:简单工厂模式、工厂模式、抽象工厂模式、原型模式、单例模式。它重点在于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。
请举例说明哪些情况下可以使用组合模式
宏命令,MVC中的View图,文件夹的管理
抽象工厂模式和原型模式有哪些相同和不同,可以联合使用吗?
抽象工厂模式:通常由工厂方法模式来实现。但一个工厂中往往含有多个工厂方法生成一系列的产品。这个模式强调的是客户代码一次保证只使用一个系列的产品。当要切换为另一个系列的产品,换一个工厂类即可。
原型模式:工厂方法的最大缺点就是,对应一个继承体系的产品类,要有一个同样复杂的工厂类的继承体系。原型模式中的工厂方法为clone,它会返回一个拷贝(可以是浅拷贝,也可以是深拷贝,由设计者决定)。为了保证用户代码中到时可以通过指针调用clone来动态绑定地生成所需的具体的类。这些原型对象必须事先构造好。
原型模式相对工厂方法模式的另一个好处是,拷贝的效率一般对构造的效率要高。
二者可以联合成为原型工厂模式
请给出一个适合使用策略模式的示例场景,并说明与不使用策略模式相比,使用策略模式有哪些优点
超市的各种折扣策略。
策略模式满足“开闭原则”,超市可以在不修改原有系统的基础上选择算法和行为,对现有优惠策略的变更非常方便。策略模式可以避免使用多重条件转移语句
请举例说明你对白箱复用和黑箱复用的理解
继承就是白箱复用,对于父类的封装性不好;组合时黑箱复用,调用者并不清楚依赖对象的实现细节。
GOF设计模式有几种类型,分别包括那些模式
23种,分别是创建型模式(5种)、结构型模式(7种)、行为型模式(11种)
请举例说明桥接模式如何将抽象部分与它的实现部分分离,使它们可以独立地变化
假如你有一个几何形状Shape类,从它能扩展出两个子类: 圆形Circle和 方形Square 。 你希望对这样的类层次结构进行扩展以使其包含颜色,所以你打算创建名为红色Red和蓝色Blue的形状子类。 如图所示的桥接模式uml图实现了在颜色和形状两个维度上的划分:
简述组合模式和装饰模式的基本思路,并说明两者有何异同
组合模式是组合多个对象形成树形结构以表示’整体-部分’的关系层次,组合模式对单个对象和组合对象的使用具有一致性。
装饰模式则强调能给一个对象增加一些额外的职责和功能。
二者都属于结构型模式,意在将类或者对象结合在一起形成更大的结构。
组合模式相较于装饰模式,实现对象往往含有树形结构,并且引入了抽象容器构建类使得客户端能以一致的方式处理树形结构中的叶子节点和容器节点。
请具体说明你认为文档编辑器是如何处理大量的字符对象的
使用了享元模式,通过共享技术实现相同或相似对象的重用。用享元池存相关对象。
简述什么是硬编码,并说明硬编码有什么缺点?
硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中的软件开发实践。其特点有:
①硬编码数据通常只能通过编辑源代码和重新编译可执行文件来修改
②硬编码的数据通常表示不变的信息,例如物理常量,版本号和静态文本元素。
简述类适配器模式和对象适配器模式的基本思想,并说明两者有和异同
二者的基本思想都是:将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
不同在于对象适配器——将Adapter类作修改,不是继承Adaptee类,而是持有Adaptee的实例,以解决兼容性的问题。对象适配器更符合“合成复用原则”(系统中尽量使用关联关系来替代继承关系)。
简述工厂方法模式和抽象工厂模式的基本思想,并说明两者有何异同
工厂模式:定义一个用于创建对象的借口,让子类决定实例化哪一个类。
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
基本思想都是将对象的创建与使用分离。
区别在于:产品是否单一,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。
简述状态模式和策略模式的基本思想,并说明两者有何异同?
**策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
状态模式策略模式很相似,都将类的"状态"封装了起来,在执行动作时进行自动的转换,从而实现,类在不同状态下的同一动作显示出不同结果。
但状态模式与策略模式的区别在于,这种转换是"自动","无意识"的。
**
现在大多数软件都有撤销和重做的功能,请问这种功能一般是草用什么设计模式实现的,并举例说明是如何实现的。
**主要使用的是命令模式 。
**
面向对象软件设计中,给一个类或对象增加行为(新功能)的方式有哪些?请举例说明
继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法,但是这种方法是静态的,用户不能控制增加行为的方式和时机。
关联机制:将一个类的对象嵌入另一个对象中,由另一个对象来调用嵌入对象的行为同时扩展其行为,我们称另一个对象为装饰器。
简述外观模式和中介者模式的基本思想,并说明两者有何异同?
外观模式:为子系统的一组接口提供一个统一的入口。
中介者模式:用一个中介对象来封装一系列的对象交互,使原有个对象之间不需要显示地相互引用,从而使其耦合松散。
外观模式封装的是子系统外部和子系统内部模块间的交互;而中介者模式是提供多个平等的同事对象之间交互关系的封装,一般是用在内部实现上。也就是说外观模式是外部到系统内部的单向的交互,中介者模式是内部多个模块的多向的交互。
请给出一个适合使用状态模式的示例场景,并说明与不适用状态模式相比,有哪些优点?
在标准大气压条件下,水在温度低于0℃为固态,0~100℃为液态,大于100℃为气态。
用状态模式的优点:
①封装了状态的转换规则,可以对相应代码进行集中管理
②将与状态相关的行为放在一个类,只需要注入不同状态即可让环境对象拥有不同的行为
③状态模式避免了使用庞大的条件语句与转换代码
你认为设计模式能否增强软件复用性?请列举两个模式并结合实例进行说明。
能。
装饰模式可以动态的给对象添加职责,增强了软件复用性,将简单的类复合起来得到功能更复杂的类。
在面向对象设计时,采用水平关联(含依赖、组合、聚合、普通关联等)的方法或者继承都可以适应变化。请说明两种方式在适应变化上各自的优缺点。
**组合关系——
优点①不破环封装性,类之间松耦合,彼此相对独立
②具有较好的可扩展性
③在运行时,整体对象可以选择不同类型的局部对象
④整体可以对局部进行包装,封装局部类的接口提供新的接口
缺点①整体类不能自动获得和局部类同样的接口
②创建整体类的对象时需要创建所有局部类的对象
继承关系——
优点①子类能自动继承父类的接口
②子类对象创建时,无需创建父类对象
缺点①破坏封装性,父类子类之间紧耦合,子类依赖父类实现,缺乏独立性
②支持扩展,但往往以增加系统结构为代价
③不支持动态继承,在运行时子类无法选择不同的父类
④子类不能改变父类的接口
**
变化整体上分为接口变化和实现变化。若这两类变化同时存在,通常应首先采用那种设计模式分离稳定与变化部分?举例说明如何设计。
工厂方法、桥接模式、策略模式都可以。
所谓的变化部分我们可以理解为接口或者类的扩展,而呈现给客户的只是一个统一的接口,用户不必关心内部如何实现,只要每次调用同一个方法,只传不同即可,而针对接口的变化,采用以上结合适配器模式即可转换关键代码部分。
请举例说明什么是简单工厂方法?什么是单件(单例)模式?分别是如何实现的?
简单工厂模式可以根据参数的不同返回不同类的实例。
单例模式是确保莫一个类只有一个实例,并且能自行实例化并向这个系统提供这个实例。
线性聚集关系是一种现实中常见的逻辑关系,如一个A聚集多个B,一个B聚集多个C,…….。使用合成模式可以统一的接口访问各个部分。请给出本例应用合成模式的设计类图。子类聚集父类时该模式的特点之一,请再说出也具有该特点的其它几个模式的名称。
装饰模式、观察者模式
为达到某些设计目的,设计时可以同时组合使用多个设计模式。请举出一个同时组合使用策略模式和对象适配器模式。要求给出例子的应用场景,设计方案。
应用场景:User中提供给用户的接口是一个普通的按钮,通过点击按钮实现排序算法,该排序算法可能在不同的时间发生改变(用户可以实现其他算法,按钮也可能变成倒计时等形式触发算法行为)。
软件公司要开发一个图形界面组件库,界面组件分为两大类,一类是单元控件(例如:按钮、文本框等),一类是容器控件,例如对话框、表单等,请问采用何种模式设计比较好?请画出UML设计类图
组合模式
化妆品公司的报表系统可将不同月份的销售数据以柱状图、曲线图和饼状图等多种形式展示出来。各个月份的销售数据可以从文本文件中获取,也可以从数据库中获取,还可以从Excel文件中获取,如果需要从Excel文件中获取数据,则需要调用与Excel相关的API,而这个API是现有系统所不具备的,该API由厂商提供。请问采用何种模式设计比较好?请画出UML设计类图。
桥接模式+适配器模式
你认为面向对象方法中类设计的难点是什么,如何应对?
难点:设计可复用的类要求必须找到相关的对象,以适当的粒度归类,在定义类的接口和继承层次,建立对象间的基本关系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。你也希望避免重复设计或尽可能少做重复设计。
应对方法:学习设计模式,用更加简单方便的设计和体系结构。
请阐述你对开闭原则的理解,以及如何设计能达到开闭原则的要求?
理解:软件实体(模块、类、方法)应对扩展开放,对修改关闭,可以让软件系统复用,并易于维护。
设计方法:
①对软件系统中不变的部分加以抽象成不变的接口,以应对未来的扩展。
②接口最小功能设计原则:原有的接口要么可以应对未来的扩展,不足的部分可以通过定义新的接口来实现。
③模块之间的调用通过抽象接口进行,这样即使实现层发生变化,也无需修改调用方的代码。
综上,软件系统是否具有良好的接口(抽象)设计是判断软件系统是否满足开闭原则的一种重要的判断基准。
请举例说明在应用标准外观模式时可能产生的问题,以及对应的解决方案。
存在的问题是:可能通过继承一个外观类在子系统中加入了新的行为。
银行信用卡中心的电子账单系统包括了发送器、账单、广告信和发送队列等对象,其中广告信的业务逻辑是:先到数据库中把客户信息一个一个的取出,每个客户都生成一份个性化的邮件,然后交给发送机进行发送处理。请问使用哪种模式设计广告信较好?如何设计?
每个客户都要发送一个个性化邮件,所以使用原型模式
当一个系统要由多个产品系列中的一个来配置时,我们选择抽象工厂模式
当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时,我们选择建造者模式
当一个类希望由它的子类来指定它所创建的对象的时候,我们选择工厂模式
当一个系统应该独立于它的产品创建、构成和表示时,要使用抽象工厂模式
当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时,要使用单例模式
当你想使用一个已经存在的类,而他的接口不符合你的需求时,要使用适配器模式
当你想表示对象的部分-整体层次结构,要使用组合模式
当不能采用生成子类的方法进行扩充时,要使用装饰模式
当你要为一个复杂子系统提供一个简单接口时,要使用外观模式
一个应用程序使用了大量的对象,要使用享元模式
在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用代理模式
你想在不明确指定接收者的情况下,向对各对象中的一个提交一个请求时,要使用职责链模式
访问一个聚合对象的内容而无需暴露它的内部表示,要使用迭代器模式
一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解,要使用中介者模式
当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变,要使用观察者模式
一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为,要使用状态模式
开发一个用于数值计算的大型程序库,他的功能是强大的,但需要使用者具备较高的数学专业知识。为方便菜鸟级用户的使用,需要提供一个简化版的,但同时又不希望影响专业人员的使用。使用那种设计模式较好?如何设计?
外观模式
在2D游戏的开发中,需要绘制地图,地图由大量的“一样的图块”拼接而成,而“图块”的种类有限,目前有草地、海洋、沙漠、山地等,未来肯定要增加种类,但不会太多太频繁。采用何种模式设计“图块”类比较好?如何设计?
人物构成要素复杂,应该用建造者模式,地图块只有有限的几种,一整个地图上大面积重复,应该用享元
老师给的选择题:
采用面向对象方法设计的应用程序的特点是:可复用性更强
面向对象方法中类的设计不包括:代码的组织与表示
下列关于面向对象和设计模式的描述中,错误的是:一个设计良好的面向对象应用程序应具有低内聚、高耦合的特点
面向对象设计应支持变化,下列相关描述中,不正确的是:建议通过修改既有代码来适应变化
下列选项中最适合用依赖关系描述的是:工厂和产品
在一个课程注册系统中,定义了类CourseSchedule和类Course,其中类CourseSchedule中定义了方法add(Course c)和方法remove(Course c),则这两个类之间的关系最可能是:依赖关系
如果类A仅在其成员函数fun中定义并使用了类B的一个对象,类A其他部分的代码都不涉及类B,那么类A与类B的关系最可能是:依赖
下列哪种用法体现出的类A和类B之间的耦合关系最强:继承(类A:protected 类B)
下列选项中属于面向对象设计原则的是:里氏替换原则
下列关于开闭原则的描述中,不正确的是:面向接口进行软件设计,可以很容易地构建100%满足开闭原则的软件系统
下列关于单一职责原则的描述中,不正确的是:单一职责原则提高了类之间的耦合性
在面向对象设计原则中,哪个原则表示高层模块不应该依赖于低层模块,都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象:依赖倒置原则
下列关于面向对象复用的描述中,不正确的是:通过生成子类的复用称为黑箱复用,通过组装或组合对象的复用称为白箱复用
下列关于面向对象设计基本原则的描述中,错误的是:高层模块应该依赖于低层模块
以设计复用为目的,采用一种良好定义、正规的、一致的方式记录的软件设计经验的是:设计模式
下列关于设计模式的描述中,正确的是:使用设计模式能提高软件开发效率
下列关于设计模式的描述中,不正确的是:理论上,设计模式一定是最优秀的解决方案
设计模式的两大主题是:系统复用与系统扩展
设计模式具有的优点是:提升软件设计的质量
设计模式不能解决下列哪个问题:确定软件功能都正确实现
下列关于创建型模式的描述中,错误的是: 创建型模式中客户程序必须知道要创建对象的所属具体类
在简单工厂模式中,如果需要增加新的具体产品,通常需要修改( 工厂类 )的源代码
以下关于工厂方法模式的叙述,错误的是( 工厂方法模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态,工厂方法模式退化后可以演变成抽象工厂模式 )。
下列关于工厂方法模式的描述中,不正确的是:工厂方法模式是对象创建型模式
某银行系统采用工厂模式描述其不同账户之间的关系,设计出的类图如下所示。其中与工厂模式中的工厂角色、产品角色相对应的类分别是:Bank,Account
提供一个创建一系列相关或相互依赖对象的接口的是:抽象工厂模式
小明正在设计一款音视频播放软件,该软件要能支持界面主题的更换,即界面中的按钮、字体、背景等一起随界面主题的改变而变化。针对上述需求,采用哪个设计模式最为合适:抽象工厂模式
某公司要开发一个图表显示系统,在该系统中曲线图生成器可以创建曲线图、曲线图图例和曲线图数据标签,柱状图生成器可以创建柱状图、柱状图图例和柱状图数据标签。用户要求可以很方便地增加新类型的图形,系统需具备良好的可扩展能力。针对这种需求,公司采用( 抽象工厂模式 )最为恰当。
游戏不同场景中的房屋都由五个部分组成:地板、墙壁、窗户、门和天花板,构建房屋的步骤固定,而具体组件(门、窗等)易变。针对上述房屋,采用哪个设计模式最为合适:(建造者)
开发一个自动生成公文的程序,公文的基本内容包括标题、主送单位、正文、发文单位、日期及签发人等,程序应支持频繁地创建相似公文对象。采用哪个设计模式最为合适:原型模式
某公司要开发一个即时聊天软件,用户在聊天过程中可以与多位好友同时聊天,在私聊时将产生多个聊天窗口,为了提高聊天窗口的创建效率,要求根据第一个窗口快速创建其他窗口。针对这种需求,采用( 原型模式 )进行设计最为合适。
限制类的实例对象只能有一个的是:单例模式
下列关于单例模式的描述中,不正确的是:单例类可以派生子类,易于扩展
某软件系统需要从指定的XML文件读取较多的配置参数,作为全局共享资源,方便系统初始化及运行过程中使用。针对上述场景,哪个设计模式最为合适:单例
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作的是:适配器模式
下列关于适配器模式的描述中,不正确的是:同一个适配器可以把适配者类和它的子类都适配到目标接口
在对象适配器中,适配器类(Adapter)和适配者类(Adaptee)之间的关系为:关联关系
现在需要开发一个文件转换软件,将文件由一种格式转换成另一种格式,例如将XML文件转换成PDF文件,将DOC文件转换成TXT文件,有些文件格式转换代码已经存在,为了将已有的代码应用于新软件而不需要修改软件的整体结构,可以使用:适配器模式
用于分离接口和具体实现,使得接口和实现可独立变化的是:桥接模式
桥接模式的本质是:分离抽象和实现
轿车可按品牌分,如红旗、奔腾、中华等,也可按变速方式来分,如手动、自动等,还可按驱动方式来分,如前驱、后驱、四驱等。针对上述轿车,采用哪个设计模式最为合适:桥接模式
小明正在设计一个银行业务系统,该系统对于日志记录有如下要求:按格式分类需记录操作日志、 交易日志、 异常日志等; 按照距离分类分为在本地记录日志和在异地记录日志等。针对上述需求,采用哪个模式能够方便地记录各种日志:桥接模式
可以用来描述树形结构的是:组合模式
为了使客户端以一致的方式处理树形结构中的叶子节点和容器节点,实现客户端的透明操作,组合模式中引入了:抽象构件类
用于为一个对象添加更多功能而不使用子类的是:装饰模式
下列关于外观模式的描述中,不正确的是:外观模式是迪米特原则的一种具体实现,同时也完全符合开闭原则
下列哪个模式是迪米特原则的典型应用:外观模式
小明正在维护一个遗留的大型系统,该系统设计粗糙且遗留代码高度复杂,但新需求的开发却必须依赖于它所包含的一些功能,针对上述需求,采用哪个设计模式最为合适:外观模式
设计一个模块M,为系统中其他模块提供访问不同数据库的通用接口,这些数据库的访问接口有一定的差异,但访问过程相同,例如,先连接数据库,再打开数据库,最后对数据库进行查询。针对上述模块M,采用哪个设计模式最为合适:外观模式
在构建一个层次结构的系统时,可以使用下列哪个模式来定义系统中每层的入口点:外观模式
小明要编写一个鼠标击点破泡泡的解压小游戏,假设共有66个泡泡,每个泡泡的大小都一样,颜色随机,但一定是5种指定颜色中的1种,位置随机,那么设计泡泡时最适合使用: 享元模式
下列关于代理模式的描述中,不正确的是:代理模式中客户端需要知道真实主题(RealSubject)对象
代理模式的本质是:控制对象访问
计算机使用者一般会在Windows系统桌面上设置常用软件的快捷方式,以快速方便地启动软件。针对上述场景,哪个设计模式最为合适:代理模式
下列关于职责链模式的描述中,不正确的是:发出这个请求的客户端知道链上的哪一个处理者最终处理了这个请求
下列关于命令模式的描述中,不正确的是:宏命令是命令模式和装饰模式联用的产物
Web开发人员对Web服务器管理的所有Web资源:例如JSP,Servlet,静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能,例如实现URL级别的权限访问控制,过滤敏感词汇,压缩响应信息等,针对上述需求,采用哪个模式最为合适:职责链模式
体现“集中管理多个对象间的交互过程和顺序”的是:中介者模式
下列关于中介者模式的描述中,不正确的是:中介者模式用中介者和同事的多对多交互代替了原来同事之间的一对多交互
个人计算机由主板、CPU、内存、显卡、声卡、网卡和硬盘等配件组装而成,各个配件的交互一般通过主板来完成,针对上述场景,哪个设计模式最为合适:中介者
小明正在设计一个通用数据处理软件,需要支持多个系统之间的数据传递与交换。该软件要求能够屏蔽各系统之间的直接数据交互,使其耦合松散,并且可以独立改变系统之间的交互过程。针对上述需求,采用哪个模式最为合适:中介者模式
很多游戏软件中都提供了“储存/载入进度”的功能,支持玩家在中断游戏后仍然能够重新载入被储存的进度继续游戏。针对上述场景,哪个设计模式最为合适:备忘录
下列关于状态模式和策略模式的描述中不准确的是:使用状态模式时,客户端需要知道环境类的状态是如何切换的
要创建一个触发链,A对象行为将影响B对象,B对象行为将影响C对象……,可以使用:观察者模式
MVC架构在实现上结合了多种设计模式,其中最典型的模式应用是:中介者和观察者
兄弟俩要到操场上玩,临走时,跟妈妈说:“我俩玩去了,饭好了,招呼我们”。这段话所描述的场景最适合下列能哪种模式的应用场景?观察者模式
小明正在设计一个报价管理模块,要求对普通客户或新客户报全价,对老客户报价统一折扣5%,对大客户报价统一折扣10%。针对上述需求,采用哪个设计模式最为合适:策略模式
三国演义中刘备去东吴招亲,赵云得授3个锦囊妙计,分别是找乔国老帮忙、求吴国太放行及孙夫人断后,以助刘备顺利回归。针对上述场景,采用哪个设计模式最为合适:策略模式
下列选项中不属于对象模式的是:模板方法模式