当前位置: 首页 > news >正文

如何理解设计模式的六大原则?

我们知道,java中有类,父类,抽象类,接口这些概念,而设计模式的六大原则就解释了它们及其它们之间的关系是怎样的,接下来我们将由简到难一一剖析。

  • 开闭原则:是总纲,他告诉我们要对扩展开放,对修改关闭。即通过开闭原则,我们可以通过扩展行为来实现新的功能,而不是通过修改已有的代码。开闭原则可以帮助我们构建一个稳定,灵活的软件系统。

  • 单一职责原则:面向对象最基本的概念就是类,此告诉我们实现要职责单一。即每个类应该只负责一项规范,这是为在部分职责发生变化时,牵连到其他职责,是为了解耦合。

  • 迪米特法则:告诉我们类与类之间要要降低耦合,也叫最少知识原则,是指一个对象应该对其依赖的对象有最少的了解。一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。

  • 里氏替换原则:说完了类,就不得不提到子类和父类,如何保证子类和父类?而里氏替换原则规范。即子类可以替换父类,告诉我们只要父类能出现的地方子类就能出现。它体现了java三大特点中的继承,子类的权限不能低于父类。

  • 接口隔离原则:告诉我们在设计接口的时候要精简单一,通俗的说要建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。

  • 依赖倒置原则:对接口和抽象类的功能做了规范,通常情况的设计都是高层模块依赖于低层模块(比如说在盖楼过程中,需要打好地基,才可以修建好上层建筑)。这样看似顺理成章,低层模块不怎么变动,高层模块调用低层模块。但是事实上,事物总是在变化,经常低层模块变化,引起高层一系列的变化。即底层依赖于高层。细节应该依赖于抽象,因为抽象的东西要稳定的多。接口中制定好规范就好,不需要事先具体操作,即面向接口编程。

专业解释:

1、单一职责原则(Single Responsibility Principle,简称SRP )

  • 核心思想:应该有且仅有一个原因引起类的变更
  • 问题描述:假如有类Class1完成职责T1,T2,当职责T1或T2有变更需要修改时,有可能影响到该类的另外一个职责正常工作。
  • 好处:类的复杂度降低、可读性提高、可维护性提高、扩展性提高、降低了变更引起的风险。
  • 需注意:单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否优良,但是“职责”和“变化原因”都是不可以度量的,因项目和环境而异。

2、里氏替换原则(Liskov Substitution Principle,简称LSP)

  • 核心思想:在使用基类的的地方可以任意使用其子类,能保证子类完美替换基类。
  • 通俗来讲:只要父类能出现的地方子类就能出现。反之,父类则未必能胜任。
  • 好处:增强程序的健壮性,即使增加了子类,原有的子类还可以继续运行。
  • 需注意:如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系 采用依赖、聚合、组合等关系代替继承。

3、依赖倒置原则(Dependence Inversion Principle,简称DIP)

  • 核心思想:高层模块不应该依赖底层模块,二者都该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象;
  • 说明:高层模块就是调用端,低层模块就是具体实现类。抽象就是指接口或抽象类。细节就是实现类。
  • 通俗来讲:依赖倒置原则的本质就是通过抽象(接口或抽象类)使个各类或模块的实现彼此独立,互不影响,实现模块间的松耦合。
  • 问题描述:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。
  • 解决方案:将类A修改为依赖接口interface,类B和类C各自实现接口interface,类A通过接口interface间接与类B或者类C发生联系,则会大大降低修改类A的几率。
  • 好处:依赖倒置的好处在小型项目中很难体现出来。但在大中型项目中可以减少需求变化引起的工作量。使并行开发更友好。

4、接口隔离原则(Interface Segregation Principle,简称ISP)

  • 核心思想:类间的依赖关系应该建立在最小的接口上
  • 通俗来讲:我觉得这里的隔离翻译为分离是更确切的。建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
  • 问题描述:类A通过接口interface依赖类B,类C通过接口interface依赖类D,如果接口interface对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。
  • 需注意
  • 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度
  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情
  • 为依赖接口的类定制服务。只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

5、迪米特法则(Law of Demeter,简称LoD)

  • 核心思想:类间解耦。
  • 通俗来讲: 一个类对自己依赖的类知道的越少越好。自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚。无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。低耦合的优点不言而喻,但是怎么样编程才能做到低耦合呢?那正是迪米特法则要去完成的。

6、开放封闭原则(Open Close Principle,简称OCP)

  • 核心思想:尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化
  • 通俗来讲: 一个软件产品在生命周期内,都会发生变化,既然变化是一个既定的事实,我们就应该在设计的时候尽量适应这些变化,以提高项目的稳定性和灵活性。

相关文章:

  • 设计模式的分类
  • 盲并遗忘着-利用应用交付透析大型网站日志
  • 请手写一下单例模式?
  • ArrayList
  • python 遗传算法精简版
  • B-树和B+树区别
  • 红黑树
  • 负载均衡之基于L3/4负载
  • 跳表
  • 关于CookieUtile的相关代码
  • iOS_15_通过代码自己定义cell_微博UI
  • 排序
  • 哈希冲突解决方法
  • Activiti的引擎与引擎配置对象
  • dfs和bfs
  • [笔记] php常见简单功能及函数
  • Docker入门(二) - Dockerfile
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java教程_软件开发基础
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Protobuf3语言指南
  • Python 反序列化安全问题(二)
  • 大快搜索数据爬虫技术实例安装教学篇
  • 力扣(LeetCode)56
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 使用 QuickBI 搭建酷炫可视化分析
  • 译米田引理
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​Linux·i2c驱动架构​
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #HarmonyOS:基础语法
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (WSI分类)WSI分类文献小综述 2024
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (十三)Flask之特殊装饰器详解
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • ./和../以及/和~之间的区别
  • .dwp和.webpart的区别
  • .net CHARTING图表控件下载地址
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET gRPC 和RESTful简单对比
  • .net mvc 获取url中controller和action
  • .Net 路由处理厉害了
  • .NET 中 GetProcess 相关方法的性能
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET成年了,然后呢?
  • .net程序集学习心得
  • .net流程开发平台的一些难点(1)
  • .Net中的集合
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @Responsebody与@RequestBody
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决