Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day30】—— 设计模式1(1)

车票

  • 面试题1:面向对象程序设计(OOP)的六大原则分别有哪几个

  • 面试题2:你说一下什么是设计模式

    • 追问1:那你怎么理解高内聚和低耦合?
  • 面试题3:设计模式有哪几种?

    • 追问1:你比较熟悉哪种设计模式?说说原理。
  • 追问2:那你说说适配器模式的原理吧

  • 每日小结


本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识集合容器并发编程JVMSpring全家桶MyBatis等ORMapping框架MySQL数据库Redis缓存RabbitMQ消息队列Linux操作技巧等。

面试题1:面向对象程序设计(OOP)的六大原则分别有哪几个

============================================================================================

  • 开闭原则(Open Close Principle)及“开放-封闭原则”
  • 单一职责原则(Single Responsibility Principle)
  • 里氏替换原则(Liskov Substitution Principle)
  • 依赖倒置原则(Dependence Inversion Principle)
  • 接口隔离原则(Interface Segregation Principle)
  • 最少知识原则(Law Of Demeter)

面向对象程序设计中,需要遵守的原则主要有6个,称为六大原则。面向对象程序设计原则也是我们用于评价一个设计模式的重要指标之一。在设计模式中,很多设计模式都遵守了这些原则。

| 原则名称 | 内容说明 |

| — | — |

| 开闭原则 | 对扩展开放,对修改关闭。 |

| 单一职责原则 | 即一个类只负责相应领域的职责,即不要存在多于一个导致类变更的原因。 |

| 里氏代换原则 | 子类型必须能够替换它们的父类型。一个软件实体如果使用的是一个父类,那么当把这个父类替换成继承该父类的子类,程序的行为不会发生任何变化。软件实体察觉不出父类对象和子类对象的区别。 |

| 依赖倒置原则 | 要依赖于抽象,不要依赖于具体。客户端依赖于抽象耦合。抽象不应当依赖于细节;细节应当依赖于抽象;要针对接口编程,不针对实现编程。 |

| 接口隔离原则 | 客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。 |

| 最少知识原则 | 对象与对象之间应该使用尽可能少的方法来关联,避免千丝万缕的关系。 |


在这里插入图片描述

课间休息,又来秀一下来自咱们群里同学的搬砖工地的小火锅~坐标:重庆

作者:唐伯虎点香烟


面试题2:你说一下什么是设计模式

===============================================================================

设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性。我们使用设计模式最终的目的是实现代码的 高内聚低耦合

追问1:那你怎么理解高内聚和低耦合?


耦合:

也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差

内聚:

故名思议,表示内部间聚集、关联的程度,那么高内聚就是指要高度的聚集和关联。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。

高内聚低耦合,是软件工程中的概念,是判断软件设计好坏的标准,主要用于程序的面向对象的设计,主要看类的内聚性是否高,耦合度是否低。目的是使程序模块的可重用性、移植性大大增强。通常程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。


在这里插入图片描述

课间休息,又来秀一下我家小哈迷人的睡姿,就不打马赛克了~


面试题3:设计模式有哪几种?

=============================================================================

总体来说设计模式分为三大类:

  • 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

  • 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

  • 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

除了23种常见设计模式外,其实还有两类:并发型模式和线程池模式。

| 模式类型 | 名称 | 定义 |

| — | — | — |

| 创建型 | 工厂方法模式(Factory Pattern) | 定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法模式是一个类的实例化延迟到子类。 |

| 创建型 | 抽象工厂模式(Abstract Factory Pattern) | 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 |

| 创建型 | 单例模式(Singleton Pattern) | 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。 |

| 创建型 | 建造者模式(Builder Pattern) | 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 |

| 创建型 | 原型模式(Prototype Pattern) | 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 |

| 结构型 | 适配器模式(Adapter Pattern) | 将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作 |

| 结构型 | 桥接模式(Bridge Pattern) | 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 |

| 结构型 | 组合模式(Composite Pattern) | 组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。使得用户对单个对象和组合对象的使用具有一致性。 |

| 结构型 | 装饰器模式(Decorator Pattern) | 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。 |

| 结构型 | 外观模式(Facade Pattern) | 为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 |

| 结构型 | 享元模式(Flyweight Pattern) | 运用共享技术有效地支持大量细粒度对象的复用。 |

| 结构型 | 代理模式(Proxy Pattern) | 为其他对象提供一种代理以控制对这个对象的访问。 |

| 行为型 | 责任链模式(Chain of Responsibility Pattern) | 使多个对象都有机会处理请求,从而避免请求发送者与接收者耦合在一起。将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 |

| 行为型 | 命令模式(Command Pattern) | 将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。 |

| 行为型 | 解释器模式(Interpreter Pattern) | 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 |

| 行为型 | 迭代器模式(Iterator Pattern) | 提供一种方法来访问聚合对象中的各个元素,而不用暴露这个对象的内部表示。 |

| 行为型 | 中介者模式(Mediator Pattern) | 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 |

| 行为型 | 备忘录模式(Memento Pattern) | 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。 |

| 行为型 | 观察者模式(Observer Pattern) | 定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。 |

| 行为型 | 状态模式(State Pattern) | 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 |

| 行为型 | 策略模式(Strategy Pattern) | 定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。 |

| 行为型 | 模板方法模式(Template Pattern) | 定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 |

| 行为型模式 | 访问者模式(Visitor Pattern) | 表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 |

追问1:你比较熟悉哪种设计模式?说说原理。


面试者老王:我都略懂一些。

面试官:那你走吧,简历还你。

在这里插入图片描述

面试者老王:???

面试者老王:那我比较了解工厂、单例、代理和适配器模式。

追问2:那你说说适配器模式的原理吧


二狗不知道在哪听说华为手机就是牛,非要新买了一个华为手机,它高高兴兴的拿到新手机,想要插上耳机听歌,但发现手机没有通用的原型耳机孔,仔细看了说明书之后发现,华为手机是充电孔耳机孔在一起,在插耳机时需要一个耳机口转接器,才能插耳机。我们用程序员的眼观来看,这里相当于增加了一个转接器类用于适配耳机,这就类似于设计模式 —— 适配器模式(Adapter)

适配器模式包装目标类即适配者(Adaptee)成适配器。适配器提供客户端所需要的接口,把客户端的请求转化成对适配者的调用。也就是说,客户端访问适配器时,在适配器内部将调用适配者的方法。

在这里插入图片描述

  • Client:客户端,调用自己需要的接口Target

  • Target:定义客户端需要的跟特定需求相关的接口

  • Apaptee:已存在接口,通常满足功能需求但与特定需求接口不一致

  • Adapter:适配器,将Adaptee适配为Client需要的Target接口。

适配器模式的主要功能是进行转换匹配,用来复用已有的功能。适配器模式将某个类的接口转换成客户端期望的另一个接口,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类适配器模式、对象适配器模式、接口适配器模式

三种适配器模式有各自的应用场景

  • 类的适配器模式:将一个类转换成满足另一个新接口的类,创建一个新类,继承原有的类,实现新的接口即可。

  • 对象的适配器模式:将一个对象转换成满足另一个新接口的对象,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法即可。

  • 接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

适配器模式的本质是:转换匹配,复用功能。适配器模式中被适配的接口Adaptee与适配的接口Target没有关系,他们中的方法可以相同,也可以完全不同,适配器模式的实现方式是通过组合对象的方式进行的,将功能委托给被适配的对象进行的。适配器模式调用的序列图如下所示:

在这里插入图片描述

适配器模式的实现有以下几种:

  1. 常见适配:适配器类会实现接口,在实现过程中调用待适配的类中的方法

  2. 智能适配器:在适配器类中实现接口中定义的新方法,通常来说,适配器类中既可以通过借助继承类中的方法实现高层功能,也可以实现接口中定义的新方法,进行功能扩展。

  3. 缺省适配:即对接口的缺省实现,即接口适配器模式。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

Ending

Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下

如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
[外链图片转存中…(img-tdOcGckF-1713442301552)]

[外链图片转存中…(img-QPXpGrbe-1713442301554)]

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值