设计模式面试 - Hamill


带有 4 个示例面试问题的设计模式概述,可帮助您完成下一次面试
设计模式是软件工程世界的重要组成部分。简而言之,设计模式是软件设计和开发中常见问题的可重用解决方案。它们就像我们可以用来在代码中实现解决方案的蓝图。
设计模式在面试中也出现了很多!面试官希望看到你知道设计模式的用途以及它们为何重要。他们还想知道您个人使用过哪些设计模式。
在本文中,我想概述这些设计模式是什么,并举例说明如何在实际场景中使用这些设计模式。最后,我还会举四个我个人在过去求职中遇到的面试问题的例子。
 
设计模式概述
首先,我想描述一下设计模式是如何分解的,并对每一种模式进行简要描述。
根据著名的《设计模式:可重用面向对象软件的要素》一书,共有 23 种设计模式,根据其用途可分为三类:
Creational创建型:抽象实例化过程的模式,以帮助使系统独立于其对象的创建方式。

  1. 抽象工厂- 提供用于创建相关对象系列的接口,而无需指定它们的实际类。
  2. Builder - 将对象的构造与其表示分离,以便可以利用构造过程来创建不同的表示。
  3. 工厂方法- 定义一个接口来创建一个对象,同时让子类决定要实例化哪个类。
  4. 原型 -允许通过克隆原型来创建对象。
  5. Singleton -确保一个类只有一个实例和一个全局访问点,可供所有需要访问它的人访问。

 
结构型:通过识别定义实体之间关系的方法来简化大型对象结构设计的模式。
  1. Adapter -允许两个不相关的接口通过 Adapter 类一起工作。Adapter 类是两个原本不兼容的类之间的链接。
  2. Bridge -通过在它们之间提供一个桥接 类,将抽象类与其实现分离,以便两者可以相互独立地变化。
  3. 组合 -用于以类似的方式将一组对象视为单个对象,方法是根据树结构组合这些对象以表示部分-整体层次结构。(部分-整体层次结构是由子系统或组件组成的系统,这些子系统或组件可以进一步分为更小的组件)。
  4. 装饰器 -动态地将附加职责附加到对象,为扩展功能提供子类化的灵活替代方案。
  5. Facade -为子系统中的一组接口定义一个简化的接口。这被用作一个高级界面,使其他一切都更容易使用。
  6. Flyweight -定义可以同时在多个上下文中使用的共享对象,有助于降低整个系统的内存利用率。
  7. 代理 -为另一个对象提供一个占位符以控制对其的访问。本质上是一个类,用作系统中另一个对象的接口。

 
行为型:定义系统中对象之间通用通信模式的模式。这些模式涉及对象之间的职责分配,或将行为封装在对象中并将请求委托给它。
  1. 责任链 -通过给多个对象一个处理请求的机会来避免将请求的发送与其接收者耦合。这种模式沿着一个链传递请求,直到一个对象处理它。
  2. 命令 -将请求封装到一个独立对象中,该对象包含有关请求执行的所有信息。这允许我们使用不同的请求参数化客户端,记录请求并支持通常可撤消的操作。
  3. 解释器 -定义语言中语法的表示以及使用该表示来解释语言中的句子的解释器。这种模式广泛用于面向对象语言的编译器中。
  4. 迭代器 -提供一种按顺序访问聚合对象中的元素的方法,而无需暴露这些对象的底层表示。
  5. 中介者 -定义一个对象,该对象封装一组对象如何相互交互。这种模式使对象不会显式地相互引用,并允许您独立地改变它们的交互。
  6. Memento -在不违反封装的情况下捕获和外部化对象的内部状态,这允许对象稍后恢复到该状态。
  7. 观察者 -允许对象发布对其状态的更改,而其他对象订阅以立即收到这些更改的通知。
  8. 状态 -允许对象在其内部状态发生变化时改变其行为。
  9. 策略 -也称为策略,此模式定义了一系列算法,封装每个算法并使它们可互换。这允许算法独立于使用它的客户端而变化。
  10. 模板方法 -允许子类在不改变算法结构的情况下重新定义算法的步骤。该算法是一个框架,将一些步骤推迟到这些子类。
  11. 访问者 -表示要对对象结构的元素执行的操作。允许您定义新操作,而无需修改其操作的元素的类。

 
4 个带示例答案的面试问题
  • 1)您使用过哪些设计模式?

这可能是您在求职中会遇到的最常见的一种,尽管对于应届毕业生来说不太常见。面试官希望看到你在整个职业生涯中实际使用过设计模式。
答: “在我目前的项目中,我在很多场景中都使用了观察者模式。例如,我们有一个监控子系统,当事件发生时,它会改变我们数据库中不同监控组件的状态。当这些状态发生变化时,我们有多个订阅者需要收到状态变化的通知。观察者模式通过创建单个类来监控这些组件的状态并根据需要通知订阅者,从而帮助删除其他冗余代码。”
  • 2)什么是设计模式?

这对于应届毕业生来说比较常见,因为面试官只是想看看你对设计模式有基本的了解。
答:“设计模式是解决软件设计和开发中常见问题的可重用解决方案。它们有助于解决重复代码、冗余逻辑、可扩展性等问题。”
  • 3) 为什么设计模式很重要?

这对于应届毕业生来说绝对是一个常见的问题。面试官想确保你知道什么是设计模式以及为什么使用它们。
答: “设计模式很重要,因为它们可以帮助开发人员编写干净、可读和可维护的代码。它使开发人员的生活更轻松,因为他们不必为一个问题重新发明轮子。相反,他们可以利用这些已被证明有效的知名设计模式。根据我的经验,另一个巨大的好处是设计模式有助于工程师之间的沟通。当您使用通用设计模式解释系统设计时,其他工程师可以更轻松地在脑海中描绘设计。”
  • 4) 你能告诉我什么是单例类,什么时候它可能有用吗?

我在两次针对基于 Java 的角色的不同采访中遇到了这个问题。
单例模式可能是软件工程中最广为人知且最容易实现的设计模式,所以这似乎是你在面试时想知道的关键。
我会提到,这些天单例模式有点不受欢迎。它可能会引入紧密耦合并使测试变得更难,因为您无法像通常那样模拟组件。但是,根据我的经验,它仍然会在面试中出现很多。
答: “单个类是一个类,其中该类的一个实例只能存在于应用程序中。在 Java 中,这可以通过创建一个私有构造函数来实现,该构造函数带有一个保存其结果的字段,以及一个像 getInstance() 这样的静态访问器方法。当您需要一个对象来协调整个系统的操作时,这种类型的类很有用。”

 
结论
简而言之,您希望能够自如地解释设计模式是什么,为什么要在软件工程中使用它们,并且能够解释您在职业生涯中使用过的设计模式。

参考:https://www.jdon.com/designpatterns/