秋招准备-观察者模式学习

问题的定义和发现过程:
今天在做毕业设计的项目,发现两个系统之间可能存在耦合。一开始的想法是使用事件的方式来解耦。后来发现不仅这两个系统之间存在耦合,也普遍存在于其他系统间。

解决方法的联想和具体方案:
正好最近在看面经,发现大家大部分情况都被问到了设计模式,所以就想着看看啥设计模式可以解决这个问题。最后选择了观察者模式。

于是就去google了一下什么观察者模式,就我浅显的一个小时了解之后,用我个人的话来理解就是:
观察者模式可以理解为有一些类(类1),他们的行为在设计上会影响别的类(类2、3、4)。但是我们需要在开发过程正避免类2、3、4直接调用类1的某些字段来更新状态,导致耦合。所以我们可以实现一个发布者接口,让类1实现这个接口,同时实现一个订阅者接口,让类2、3、4实现这个接口。另外需要类1维护一个动态的订阅者列表,在类1的某些状态改变的时候,通过事件发布给所有依赖于这个状态的订阅者。这样订阅者就可以避免通过直接访问发布者某些字段的行为来改变自己的特定状态,达到解耦的目的。

(我对接口和事件的知识还比较浅,而且是刚刚了解了观察者模式,如果有理解错误欢迎指出,写这个贴子目的在于记录自己的每日学习,并且锻炼结构化思考问题的能力。)
资料参考:
https://refactoringguru.cn/design-patterns
https://www.runoob.com/design-pattern/observer-pattern.html
全部评论

相关推荐

大学毕业以后很少用牛客了,当年和各位一样,天天抱着牛客刷题、找面经、求内推、吐槽面试经历……工作也有些年头了,兜兜转转换过几家公司,大大小小面试经历上百场是有的,拿到大大小小 offer 也不计其数。分享一点自己的经验,希望能帮助到各位。1. 失败是大概率事件,记得放平心态最近看到很多「投了很多公司都没回信」「简历投了被秒拒」「面试到最后一轮还是挂了」……诸如此类的动态。个人的经验是,找工作失败十有八九。•岗位已经招够了,但忘记下掉,投就是秒挂。(相信我,HR 也不爱上班)不代表你水平不行。•面试官手上有好几个选择,凭感觉选了一个,剩下的全都挂掉,不代表你水平不行。•岗位要求某项技能,但你简历里没有体现,不管你会不会,为了快速筛选只能把你挂掉,不代表你水平不行。……我被拒掉的次数,比拿到 offer 的数量多得多,这很正常。「你并不弱于人,offer 永远在下一家」不这样想的话,很容易就被不断到来的拒绝邮件击溃。2. 如果觉得自己面试技巧很烂,那广撒网试试面试是有技巧的,如何让面试官快速捕捉到你的能力,如何组织语言把你的思路提供给对方,都是需要训练的。最简单的训练方法,就是广撒网,在实战中训练。不管这家公司你最终会不会去,投就完事了。有面试机会权当练习也无妨,既能巩固背的八股文,又能锻炼表达能力;最重要的是,还不花钱。我这辈子都不会去的一家公司,就是某为。即使知道自己肯定不会去,但我还是参与了整个面试过程。(甚至拿到过 offer)3. 面试的一些现实了解一个人是非常困难的,通过短短几十分钟的面试了解一个人,就更是难上加难。所以,面试存在很多「眼缘」。你和面试官能不能聊得来,面试官感受如何,这些都会影响面试结果。有时候明明答得不错,结果还是过不了,很有可能是「运气」没到。所以没必要纠结已经失败的面试,积极准备后面的机会。总得来说:流畅的沟通,礼貌的对话,保持真诚,很重要。遇到过一些校招生,面试确实不太礼貌。面试官和你无冤无仇,基本的尊重还是要给到的。讲话要真诚且坚定,撒谎欺骗什么的,只能说连进入社会的基本资格都不具备。4. 关于内推对于大公司来说,内推与否确实很难讲是不是有用;小公司内推作用可能会大一点。大厂内推现在唯一不同,顶多是内推的人帮你查一查进度什么的,并不会让你有其他优势。所以不用迷信内推,不如专注于自己的简历和经历,提升水平。5. 关于 AI老实说,我现在写代码也会用 copilot。遇到问题,用 Google / ChatGPT 基本 half half。但如果笔试、面试 明确严禁 AI 辅助,我建议还是老实一点。一方面是提升自己的真实水平很重要,另一方面是被抓到,后果可能会很严重。越来越多企业加入诚信联盟,这种面试作弊的行为,会不会被企业拉入黑名单,很难讲。多一事不如少一事,打铁还需自身硬。其它的暂时还没想到,想到以后再聊吧……祝各位秋招顺利,找到心仪的工作。
点赞 评论 收藏
分享
08-08 06:17
已编辑
南昌理工学院 Node.js
本人大专学历,最后学历这块挂了。一直抗到终面还以为终于要成了。7.25 一面:招聘经理面,先自我介绍,项目问了亮点和难点。问了在高并发这块的经验。问了数据库优化这块,直接上MySQL底层往上倒推不讲虚的。问:怎么在mac arm编译docker容易转成服务器x86可以运行的容器。答:(心想还有这需求??)我们直接ci/cd直接在服务器编译打包的,不清楚。问:对于mongoDB的了解讲讲。答:(简历上就没写mongoDB,就是想看看有没有准备这场面试。实际上就没准备,不对这东西看好和感兴趣)说了mongo单位是文档而MySQL的单位是表,mongo适合敏捷开发。大文件,json格式数据存放。(很想讲MySQL为啥不适合…)mongo团队在npm这块也有个开源包,关于bson压缩,我实际测试和zlib的两个压缩算法相比没啥优势,和proto的压缩效率和速度更没啥优势。postgres这边有个叫jsonb,二进制存储还能检索内容,mongo换我我不想用。7.29二面:CTO面,自我介绍,上来问我跳槽频繁原因。说到业余时间在转golang,问:golang和node.js的区别。答:golang有协程或者说轻量版线程,node.js没有关于多线程,这块是底层的libuv做了这些。(想让他问libuv,我讲讲事件循环和多线程的细节,因为没看过源码担心问到)问:对于nest框架的理解答:跟前端框架Angular很像,和spring也有点相似。提供了诸多开箱即用的模块。核心是IOC和AOP。相比底层的express增加了多种不同功能的中间件。问:看过node 或者nest的源码没?答:没有……(还是问了,nest.js 源码突击看了ioc相关的循环依赖怎么解决的,就两行代码…)重心放在MySQL redis这块,因为转语言容易……问:数据库表优化讲下答:从设计表开始,主键尽量使用有序主键,比如int uuidv71:容易映射到bitmap上,如果我需要做颗粒度比较细的权限划分会用到。2: 因为MySQL插入是有序的,如果有序的主键查询会更快。不建议在MySQL放大字段,因为一个节点就是一页,MySQL默认一页16kb,如果字段大的话每页能放的数据变少了,更容易页分裂。关键字后面加索引,如果要用组合索引不要查其他字段。问:有哪些索引?答:唯一索引,主键索引,组合索引,普通索引。问:一条SQL比如order by 一个字段,where一个字段,能用几个索引?答:多个,一个索引是一个b+树,如果是用的覆盖索引就会回表用两个索引。又讲到非聚簇索引的b+树原理了。(如果面试官没给你限定单表那肯定不止这个原因)问:索引覆盖了解吗?答:非聚簇索引(又讲到这了),底层叶子节点存的是这几个组合索引字段的数据,如果你select时要其他数据会需要回表。如果不想要回表,就需要索引覆盖,就是只查组合索引定的那几个字段。问:对一张上亿的表进行优化。(这块我答的也不太好,之前公司就没做过)答:分情况,如果这个是线上的表,垂直拆分就做不了。可以做个水平拆分,按照时间划分把旧的数据拆分到新表或者新库中。如果这是线下的就可以考虑将业务比较少用到的,大字段拆分到新表中。最后还要考虑有没有深度翻页的问题。问:有没有进过外包答:有,外企的,图有转正机会去的。反问环节,面试就十几分钟,担心时间太少主动和面试官说我这能抗住一个半小时的面试(就是担心技术优势不能盖过学历劣势)最后面试时长半个小时多点,工作中postgres用的很多,讲了pg的b树和MySQL的b+树差异。还被关于分布式一致性问题,还说了自己会的哪些算法。面试官还问能不能英语介绍自己…看样子很重视英语。8.4终面,VP副总裁面。问:离职原因总共花费13分钟,问完离职原因就不想问了,反问我要问什么,我一看这家伙就不想放我,面试结束。8.7主动询问HR最后不出意外就是没有通过,终面完第二天就在boss看到他们公司疯狂沟通。感觉cto不是特别想要或者就是cto说话也不管用啊。感觉就是学历问题。咱大专就等于坐过牢,英雄不问出处只有在电视剧中才能看到,没哪家企业愿意。还是转golang了,node.js 17k以上很多都是全栈岗了,全栈基本就是前后端精通工资也没高级后端工资高,钱少事多没发展。高级 node.js 岗位很少,没个本科基本就投不进去。有也是外包,或者英语口语熟练。总结:node.js后端专精没必要,国内没什么人用。要么你是前端想往全栈转。全栈你转了也不会工资怎么涨的,建议就专精本行提升学历。目前学到golang的 gin gorm crud 感觉也不难。
查看18道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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