9 个不寻常的设计模式面试问题(附答案)
在软件工程中,设计模式是针对软件设计中常见问题的通用可重复解决方案。设计模式并非可以直接转化为代码的最终设计。它是一种解决问题的描述或模板,可用于多种不同情况。
问题 1:什么是设计模式以及为什么人们应该使用它们?
主题:设计模式
难度:⭐
设计模式是针对软件开发过程中最常见问题的详细描述的解决方案。
设计模式代表了经验丰富的软件开发人员在一段时间内发展出的最佳实践。它们促进了可重用性,从而使代码更加健壮且易于维护。
🔗资料来源: www.educba.com
Q2:什么是过滤模式?
主题:设计模式
难度:⭐⭐
过滤器模式或标准模式是一种设计模式,它使开发人员能够使用不同的标准过滤一组对象,并通过逻辑操作以解耦的方式将它们链接起来。这种设计模式属于结构模式,因为它将多个标准组合起来以获得单个标准。
当您需要动态添加过滤器,或者您正在实现多个功能,并且大多数功能需要不同的过滤条件来过滤某些内容时,过滤器设计模式非常有用。在这种情况下,您无需在功能内部硬编码过滤器,而是可以创建过滤条件并在需要时重复使用。
考虑:
List<Laptop> laptops = LaptopFactory.manufactureInBulk();
AndCriteria searchCriteria = new AndCriteria(
new HardDisk250GBFilter(),
new MacintoshFilter(),
new I5ProcessorFilter());
List<Laptop> filteredLaptops = searchCriteria.meets(laptops);
🔗资料来源: tutorialspoint.com
Q3:什么是策略模式?
主题:设计模式
难度:⭐⭐
在策略模式中,类的行为或其算法可以在运行时更改。这种设计模式属于行为模式。
在策略模式中,我们创建代表各种策略的对象,以及一个上下文对象,其行为根据其策略对象而变化。策略对象会改变上下文对象的执行算法。
🔗资料来源: tutorialspoint.com
Q4:什么是观察者模式?
主题:设计模式
难度:⭐⭐⭐
观察者模式(又称发布-订阅模式)用于对象之间存在一对多关系的情况,例如,如果一个对象被修改,其依赖对象将自动收到通知。观察者模式属于行为模式。
一个与关注其状态的其他对象之间存在一对多关系的对象被称为主体或发布者。观察者会在主体状态发生改变时收到通知,并据此采取行动。主体可以拥有任意数量的依赖观察者,并向其发出通知;同时,任意数量的观察者可以订阅主体以接收此类通知。
观察者模式使用两个参与者类:
- 观察者(OS订阅者)抽象类提供了一种
update()
方法,该方法将被主题调用以通知其主题状态的变化。 - Subject(或Publisher)类也是一个抽象类,并定义了四种主要方法:
attach()
、、和detach()
setState()
notify()
🔗资料来源: sitepoint.com
Q5:为什么我要使用责任链而不是装饰器?
主题:设计模式
难度:⭐⭐⭐⭐
关键区别在于,装饰器添加了新的行为,实际上扩展了原始接口。它类似于普通扩展添加方法的方式,只不过“子类”仅通过引用耦合,这意味着可以使用任何“超类”。
责任链模式可以修改现有行为,类似于使用继承覆盖现有方法。您可以选择调用super.xxx()
以继续“链”的上层操作,也可以自行处理消息。
🔗来源: stackoverflow.com
问题6:什么时候会使用建造者模式?为什么不直接用工厂模式呢?
主题:设计模式
难度:⭐⭐⭐⭐
当设计构造函数或静态工厂具有多个参数的类时,构建器模式是一个不错的选择。
想象一下一家餐馆。“今日餐”的创建是一种工厂模式,因为你告诉厨房“给我准备今日餐”,然后厨房(工厂)会根据隐藏的标准决定生成什么对象。
如果您订购定制披萨,构建器就会出现。在这种情况下,服务员会告诉厨师(构建器)“我需要一个披萨;加奶酪、洋葱和培根!” 因此,构建器会公开生成对象应具有的属性,但隐藏如何设置它们。
🔗来源: stackoverflow.com
Q7:桥接模式与适配器模式有何不同?
主题:设计模式
难度:⭐⭐⭐⭐
适配器模式的目的是使一个或多个类的接口看起来与特定类的接口相同。
桥接模式旨在将类的接口与其实现分离,以便您无需更改客户端代码即可改变或替换实现。
🔗资料来源: tutorialspoint.com
Q8:依赖注入和服务定位器模式之间有什么区别?
主题:设计模式
难度:⭐⭐⭐⭐⭐
-
使用ServiceLocator时,该类仍然负责创建其依赖项。它只是使用服务定位器来执行此操作。
-
服务定位器隐藏了依赖关系——当对象从定位器获取连接时,您无法通过查看对象来判断它是否访问数据库(例如)。
-
使用DI,类会被赋予依赖项。它既不知道也不关心这些依赖项来自哪里。
这样做的一个重要结果是,DI 示例更容易进行单元测试——因为你可以传递其依赖对象的模拟实现。你可以将两者结合起来——并根据需要注入服务定位器(或工厂)。
🔗来源: stackoverflow.com
Q9:解释一下 Facade、Proxy、Adapter 和 Decorator 设计模式之间的区别?
主题:设计模式
难度:⭐⭐⭐⭐⭐
- 适配器将给定的类/对象适配到新的接口。前者通常采用多重继承。后者则将对象包装在一个符合规范的适配器对象中并传递。我们这里要解决的问题是接口不兼容的问题。
- Facade更像是通往一组复杂功能的简单网关。你为客户创建了一个黑盒,让他们无需操心,也就是说,接口变得更简单。
- 代理提供与被代理类相同的接口,并且通常会自行处理一些日常事务。(因此,您无需复制繁重的对象 X,而是复制一个轻量级代理 P,后者负责管理 X 并根据需要转换您的调用。)这样一来,客户端就无需再管理繁重且/或复杂的对象了。
- 装饰器用于为对象(注意“对象”这个词——通常是在运行时动态装饰对象)添加更多火药。装饰器不会隐藏/削弱对象现有的接口,而只是在运行时扩展它。
🔗来源: stackoverflow.com
文章来源:https://dev.to/aershov24/9-unusual-design-patterns-interview-question-with-answers-3gjl感谢🙌的阅读,祝你面试顺利!
更多 FullStack 面试问答,请访问👉 www.fullstack.cafe