设计模式学习笔记(一)设计模式六大原则


什么是设计模式?

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码的可靠性。平常主要有这样的三大类型:

那么这些设计模式具体会遵循哪些原则呢?

设计模式遵循的原则

1. 单一职责(Simple responsibility principle, SRP)

又叫做单一功能原则,每个类只负责一项职责。是面向对象五个基本原则之一。

  1. 原则定义:一个类只有一个发生变化的原因,否则该类应该被拆分。

    • 实现:通过控制类的粒度大小,将对象解耦、提高其内聚性(类、方法、接口)
  2. 模拟场景:将 if-else 的用户(访客用户、普通用户和VIP 用户)分类进行编写职责代码(模板模式)

2. 开闭原则(Open Closed Principle,OCP)

规定“软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是对于修订是封闭的”

  1. 原则定义:扩展开发、修改封闭
    • 实现:通过接口或者抽象类为软件定义一个相对稳定的抽象层,将具体的变化封装在具体的实现类中
  2. 模拟场景:长方形-三角形-圆形的面积(扩展继承)

3. 里氏替换原则(Liskov Substitution Principle, LSP)

子类可以扩展父类的功能,但不能改变父类原有的功能,和Java 中的继承类似。

  1. 原则定义:兼容性、维护性和扩展性
    • 实现:子类继承父类时,可以扩展新的方法,但是因避免重写父类的方法
  2. 模拟场景:银行卡(信用卡、储蓄卡、地铁卡和饭卡)

4. 迪米特法则(Principle of Least Knowledge, PLK)

也叫做最小知识原则,意义在于降低类之间的耦合。由于每个对象尽量减少对其他对象的了解,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系

  1. 原则定义:最少知道、减少依赖
  2. 模拟场景:学生成绩和对应排名

5. 依赖倒转原则(Dependence Inversion Principle, DIP)

是实现开闭原则的重要途径,在软件设计中,具体的实现变化很多,但是抽象层相对比较稳定,因此以抽象为基础搭建起来的架构要比具体实现的要稳定的多。因此程序要依赖于抽象接口,尽量避免依赖于具体实现。

  1. 原则定义:多依赖于抽象,避免依赖于实现
    • 实现方法:
      • 每个类尽量提供接口或者抽象类
      • 任何类都不应该从具体类派生
      • 使用继承时尽量遵循里氏替换原则
  2. 模拟实现:爬取不同网页(新闻、官网、视频)使用模板模式抽象同一爬取流程,根据不同网页具体实现

6. 接口隔离原则(Interface Segregation Principle, ISP)

要求程序员尽量将臃肿庞大的接口拆分成更小和更具体的接口。

  1. 原则定义:要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用
    • 实现方法:
      • 接口尽量小,但要有限度。保证单一职责原则
      • 为依赖接口的类定制服务。只提供调用者需要而方法,屏蔽不需要的方法
  2. 模拟场景:一个OA系统,外部只负责提交和撤回工作流,内部负责审核和驳回工作流



#java##Java工程师#
全部评论
借楼,给大家分享一个学习Java的圈子,很多粉丝已经上岸,希望帮助大家同时,给个关注😁 https://www.nowcoder.com/discuss/993124
点赞 回复 分享
发布于 2022-07-23 00:51
学到了,有些之前确实没听过,这下长见识了
点赞 回复 分享
发布于 2022-07-16 16:55

相关推荐

每晚夜里独自颤抖:这个在牛客不是老熟人了吗
点赞 评论 收藏
分享
咦哟,从去年八月份开始长跑,两处实习转正都失败了,风雨飘摇,终于拿到offer了更新一下面试记录:秋招:多部门反复面试然后挂掉然后复活,具体问了啥已经忘了,只是被反复煎炸,直至焦香😋春招:base北京抖音hr打来电话说再次复活,准备面试,gogogo北京抖音一面:六道笔试题:1.promise顺序2.定义域问题3.flat展开4.并发请求5.岛屿数量算法(力扣)深度,广度都写6.忘记了,好像也是算法,难度中等其他问题多是框架底层设计,实习项目重难点~~~秒过😇北京抖音二面:三道笔试题:(为什么只有三道是因为第三道没做出来,卡住了)1.中等难度算法(忘记啥题了,应该是个数组的)2.认识js的继承本质(手写继承模式,深入js的面相对象开发)3.手写vue的响应式(卡在了watch,导致挂掉)---后知后觉是我的注册副作用函数写得有问题,有点紧张了其他题目多是项目拷打,项目亮点,对实习项目的贡献~~~第二天,挂,but立马复活转战深圳客服当天约面深圳客服一面:六道笔试题,由于面过太多次字节,面试官叫我直接写,不用讲,快些写完😋,具体都是些继承,深拷贝(注意对数组对象分开处理,深层次对象,循环引用),加中等难度算法题~~~秒过深圳客服二面:口诉八股大战:大概囊括网络,浏览器渲染原理,动画优化,时间循环,任务队列等等(你能想到的简单八股通通拉出来鞭尸😋)算法题:笔试题6道:1:找出数组内重复的数,arr[0]-arr[n]内的数大小为[1-n],例如[1,2,2,3,3]返回[2,3],要求o(n),且不使用任何额外空间(做到了o(n),空间方面欠佳,给面试官说进入下一题,做不来了)2:原滋原味的继承(所以继承真滴很重要)3:力扣股票购买时机难度中等其他滴也忘记了,因为拿到offer后鼠鼠一下子就落地了,脑子自动过滤掉可能会攻击鼠鼠的记忆😷~~~秒过深圳客服三面:项目大战参与战斗的人员有:成员1:表单封装及其底层原理,使用成本的优化,声明式表单成员2:公司内部库生命周期管理成员3:第三方库和内部库冲突如何源码断点调试并打补丁解决成员4:埋点的艺术成员5:线上项目捷报频传如何查出内鬼成员6:大文件分片的风流趣事成员7:设计模式对对碰成员8:我构建hooks应对经理的新增的小需求的故事可能项目回答的比较流利,笔试题3道,都很简单,相信大家应该都可以手拿把掐😇~~~过过过无hr面后续煎熬等待几天直接hr打电话发offer了,希望大家也可以拿到自己心仪的offer
法力无边年:牛哇,你真是准备得充分,我对你没有嫉妒,都是实打实付出
查看19道真题和解析
点赞 评论 收藏
分享
评论
2
26
分享

创作者周榜

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