有了解哪些设计模式?

能接触到的常见问法:
项目中有用到什么设计模式?(前端更多点)
重构使用了什么设计模式?(如果你项目强调了重构一般会问)
说说对 XX 模式的理解?(个人接触过的是单例和工厂,这两个比较多)
有接触到哪些?实际用到过哪些?(通用)

除了这些,还有一些不常见的进阶和基础问法,这些直接在下面整理
--

设计模式这个主题还挺玄乎的,个人直观体验是,自己日常实习那段时间问得挺频繁的,可能是因为没啥好问的。
找暑期实习的时候就问的少了。可能设计模式的定位还真是,个人体验也是,没有大量实践注定没有深刻的理解,对校招生的要求不会那么高吧。
所以我感觉一般策略还是要强调,能想到什么说什么,展示自己对设计模式有一个基本理解,有刻意去考虑使用设计模式这种感受。

作为面试 fw 就不多说了,这里就自己能想到什么就整理什么呢。参考价值不大,可能更多的还是要结合自己项目。
--

OOP 有哪些设计原则?如何理解?(这个可能 cpp 问的比较多,go 倒是不常问)
● 封装。定义是我们通过向对象传递消息来直接执行方法,隐藏方法细节,而不是面向过程那样直接展示方法。这个基础上扩展,才有了私有方法变量这种进一步的封装。
● 继承。继承就是字面继承一个类是属性方法,实现复用和多态。
● 多态(比较常问),定义是对象在不同条件在统一接口下有不同的行为。go 主要通过接口实现,java 和 cpp 也都是分解通过继承和接口/虚函数实现。
  ○ cpp 函数重载是一种「编译时多态」,不太符合传统理念上的多态。
  ○ 策略模式的设计模式,同一对象在不同环境下使用不同算法,就是一种常见的多态设计。比如 orm 框架适配多种存储策略,cpp 排序 stl 适配多种排序算法。

如何理解设计模式和设计原则?
● 区别简单来说,设计原则是一些比较抽象的知道原则和方向,设计模式则是一些具体的时间。
● 设计模式分为创建型、结构型、行为型三种。
● 五大设计原则 SOLID:
  ○ 单一职责:一个类只负责一个功能,具体一般也扩展到一个模块只负责一类功能,一个函数只负责一件事情。
  ○ 开闭:对扩展开放,对修改关闭。这个一旦沾了企业开发确实就接触的挺多,说到这个想起我上段实习就是上去就把代码给重构了被臭骂了一顿。总之这个的意思简单说现有的代码不应该乱改,影响稳定影响线上功能要回归测试。好的做法是,有接口留够扩展性在那(这个需要之前设计的人有实力),你的想做的新的需求应该是在现有的基础上去做扩展。还有一个常见的例子是,假设你有一个新需求,你现在有一个线上接口可以通过加参数来实现,这种情况更好的做法是另起一个新接口,因为你改改逻辑就顶天了,改函数签名影响可能就比预想的要大很多了。
  ○ 里氏替换:子类必须能替换父类,保持行为不变。这个 go 里边用不到。覆写不违反 lsp 原则,只要不改变预期行为。
  ○ 接口隔离:客户端不应该知道他不知道的功能。在 go 里面能考虑的地方还挺多的。首先接口设计上,接口要尽量小,去发现接口而不是事先创造接口。其次,go 里面接口独特的机制是隐式实现,所以双端同时使用接口不会有循环依赖问题,所以我们常见的一种实现是服务端负责完整抽象,客户端单独做他的部分抽象。这个就是经常说的,在 go 里面“避免完成生产侧的接口”
  ○ 依赖倒置:定义是上层不应该依赖下层,而都应该依赖抽象。抽象不依赖细节,细节以应该依赖抽象。设计目的是为了创造耦合性低的依赖关系,所以 DIP 往简单了说就是解耦。此外控制反转,IoC,一种具体实现 DIP 的设计模式,不手动控制对象把控制权交给容器或者框架,其实反面例子就是面向过程的手动控制对象的创建、行动相关操作。依赖注入DI,一个具体的行为,也可以说 IoC 的实现方法之一但是不只是在 ioc 里面用到,就是把对象直接作为参数传入另一个流程的一个写法而已,例子有很多,比如 vue 里边就可以注入全局变量来解决深参数传递的问题。
● 五原则回顾,开闭和依赖倒置比较常问。这两个是有点像的,不过区别也很明显,虽然都可以借助接口实现,不过一个目的是扩展一个目的是为了解耦。

常用的几个设计模式?
● 工厂:一些定义和典型实现是,专门用一个工厂类来封装创建对象的逻辑,类的创建延迟到子类。好处是封装、低耦合(创建的逻辑是独立的内聚的)、便于扩展(要增加新的创建方法的话,直接替换掉原来的工厂方法调用就好了)。
● 单例:目的是全局就是只能只应该唯一实例,否则并发问题或者管理混乱。例子像是 logger,confger,连接池,cache。然后恶汉懒汉 doublecheck 确保能单例实例化。

你 go 项目里会用到设计模式?(Java 废物,Java 那块的 aop,ddd 就不整理了)
不多说,直接提供例子,这种一般你没实际写过,能答出来面试官也不会感兴趣,所以其实一些过于抽象的模式,像是代理、桥接也就不必说了
● NewXXX()是一种简单工厂模式
● sync.Once()实现单例
● 注册模式:实现全局 init 对象到一个 map 里
● 责任链模式,我们不管请求最后会怎么样,没法解决的问题往下传,“丢锅”:gin 的中间件机制。
● WithOption、可变参数、函数闭包 实现 选项模式 https://goplay.tools/snippet/xpnL6BhCsJa
● 建造者模式就是比方我们用个 resty类似的 http 库,来发一个请求 setHeader
● 策略模式比较常见,interface 多种算法实现都是策略模式,比方说多种灰度方案限流方案数据库连接方案

偶见的设计原则开放性场景题:假如有一个历史包袱很重的项目丢给你重构,你会考虑到哪些设计原则和设计模式?(这个很考验积累了,我能做到的只能是分享这个问题和目前的浅见解了,欢迎探讨)
● 没话说就是上面的原则逐个说一遍就好了
● 肯定要强调的是模块化,高内聚低耦合,原因能想到的也围绕一些常用的点说:可维护性、复用性、扩展性、稳定性、简单性。有点八股性质了,具体还是看经验结合例子说。不过能想到这些角度感觉也是有意义的。

--

卡着实习 ddl 昨天实在没写完,精力管理确实重要。决策消耗心智大概到极限了,优化空间在于把实习的事情看得更轻一点,都打算跑了根本不用在意那么多。不过实际做起来还是很难协调,实操性大一点的地方还是在于尽量把排期铺开,分不出时间就延期。

中断一天,重新开始

#每天一篇简单博客 day2-1 
(个人打卡,欢迎监督
全部评论
1 回复 分享
发布于 2024-08-30 23:07 江苏

相关推荐

03-17 13:19
吉林大学 Java
日常。项目被拷打到死,完全问到我没看的痛点上,稳凉了,和面经差别有点大吧。。1.无自我介绍,开局就让介绍第一个项目。2.讲一下RocketMQ在项目中的具体实现。3.前端具体怎么获取到异步消息的?讲一下WebSocket长连接?轮询有什么优点和缺点?4.你觉得RocketMQ在这个项目中有哪些弊端?优化方案?还有哪些方式可以实现异步?5.其他的MQ的选型有考虑嘛?讲讲分布式事务问题怎么解决?6.你在这个项目中MySQL和Redis分别存了些什么?各自起了什么样的作用?7.另一个项目的乐观锁具体背景和具体实现9.MySQL在什么时候发生死锁10.讲一下间隙锁的底层机制?11.好,你是Java对吧,讲一下volatile关键字。具体讲一下怎么实现的可见性和有序性。12.volatile 怎么禁止指令重排?能不能解决伪共享?(???)13.讲一下联合索引的左右前缀法则14.AB联合索引,A走嘛,B走嘛。具体讲一下为什么15.讲一下索引为什么采用B+树算法。没认出来,可以看看自己能不能认出这是hot100的哪道题变式,等面试结束突然知道怎么做了😇题目: 给定一个完全无序的数组,输出无序数组中的中位数。面试官善意引导。刚面试完了才突然意识到了[微笑R]“肯定是先排序再找""知道哪些排序""快排,冒泡,堆排序…""快排讲一讲""卧槽没学啊哥我只会调api😭"≈ lc215。数组中第k个最大元素。
冰炸橙汁_不做oj版:拷打很深入
查看16道真题和解析
点赞 评论 收藏
分享
# 地狱难度笔试TOP1,我提名这家提名:**字节跳动——暑期实习研发岗**---不是因为它最偏,不是因为它题量最大,而是那种**全方位的窒息感**。**第一层窒息:题量**120分钟,15道选择题 + 3道编程题。选择题不是八股文,全是场景题——“这段代码输出什么”“这个并发问题怎么死锁的”,每一道都要在脑子里跑一遍才能答。做完选择题,45分钟没了。**第二层窒息:编程题**第一道:模拟题,但边界条件多到离谱,写完用例过了,一提交WA。调了20分钟,心态开始崩。第二道:动态规划,看着像背包,改改又像区间DP。想了10分钟没思路,先跳过。第三道:图论 + 线段树优化。看到题目的那一刻,脑子里只有一个念头——“这是给实习生做的?”**第三层窒息:时间不够**最后30分钟,第二道勉强写了个暴力,过了30%用例。第三道看了一眼,放弃。回头调第一道,终于在最后5分钟AC了。提交那一刻,手在抖,屏幕上的分数停在2.3/3——但我知道,那0.7是暴力骗来的。---**出来之后的感觉:**不是“我不会”,是“给我三小时我能做出来,但只给两小时就是筛选谁更熟练”。后来和同届交流,发现这不是我一个人的感受。牛客上搜“字节笔试”,满屏的“做麻了”“第二题有人过了吗”“第三题是给人做的吗”。---**提名理由:**它不是考你会不会,是考你在压力下能稳定输出多少。那种时间不够、思路卡壳、看着题目发呆又不敢停下的感觉,比任何一道难题都折磨人。---你心中TOP1是哪家?来互相伤害一下👀
你做过最难的笔试是哪家公...
点赞 评论 收藏
分享
评论
3
30
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务