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

设计模式的七大原则总述

软件开发过程中,程序员主要考虑的问题是:代码的耦合性,内聚性,可维护性,可扩展性,重用性,灵活性。设计模式就是对这些开发经验的总结与归纳。
1. 单一职责原则
对类来说,即一个类应该只负责一项职责,但不是说这个类只有一个方法,而是去做一件相关的事情。就比如说,你这个类是管理订单的,那么就不要出现管理员工的代码,而且如果订单比较复杂的话,也可以再拆分成不同职责的类。
这样做的好处是:
a. 降低类的复杂度,一个类只负责一项职责
b. 提高类的可读性,可维护性
c. 降低变更引起的风险
d. 通常情况下,应该遵守单一职责原则,只有逻辑足够简单,才可以在代码级别违反单一职责原则,只有类中的方法数量足够少,可以在方法级别保持单一职责原则。

2. 接口隔离原则
客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。比如一个接口中有五个方法需要实现,a1,a2,a3,a4,a5,而在业务A类中只用到a1,a2,在业务B中只用到a3.a4,这种情况下,应该拆分接口。业务中需要依赖自己需要的接口。(感觉在实际开发中,只能尽量往这个方向靠,如果完全按这个分解的话,就会变成,一个操作一个接口,用到哪个就依赖哪个了)

3. 依赖倒转原则
a. 高层模块不应该依赖低层模块,二者都应该依赖其抽象
b. 抽象不应该依赖细节,细节应该依赖抽象
c. 依赖倒转的中心思想是面向接口编程
d. 相对于细节的多变性,抽象的东西要稳定的多,以抽象为基础搭建的架构比以细节为基础的架构要稳定的多,在java中,抽象是指的接口或抽象类,细节就是具体的实现类。比如不应该给其它的模块直接提供使用Mapper的方法或dao的方法,而应该提供Service的方法。
e. 使用接口或抽象类的目的是为了制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。
依赖的传递方式有:1. 接口传递;2. 构造方法传递;3. setter方法传递。
依赖倒转原则一般要注意的是:
a. 低层模块尽量都要有抽象的类或接口,或者两者都有,稳定的稳定性更好。
b. 变量的声明类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序的扩展和优化。

4. 里氏替换原则
a. 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。
b. 继承实际上是让两个类耦合性增强了,在适当的情况下,可以通过聚合,组保依赖来解决问题。

5. 开闭原则
在类和方法应该对扩展开放,对修改关闭,用抽象构建框架,用实现扩展细节。
当软件发生变化时,尽量通过扩展软件的行为来实现变化,而不是通过修改已有的代码来实现变化。
这种原则要求我们在功能开发初期进行相关的代码设计,归纳总期需要实现的功能范围,对功能进行抽象处理,为后台的扩展留下清晰的方式,并且后面的扩展尽量不要影响旧的代码。可以参考这个案例:https://www.bilibili.com/video/BV1G4411c7N4?spm_id_from=333.788.videopod.episodes&vd_source=6fc8c9ff61efb6217b475498133ba3b3&p=17

6. 迪米法特原则,也叫最少知道原则
a. 一个对象应该对其它对象保持最少的了解
b. 类与类之间的关系越密码,耦合度就越大
耦合方式有很多,比如依赖,关联,组合,聚合,也就是常见的方法法参数,变量声明,方法返回。
对象只与直接交互的对象交互,比如A依赖了B,B依赖了C, 那么在A中最好不要直接调用C的方法,而是通过B去调用C的方法。

7. 合成复用原则
尽量使用合成或聚合的方式,而不是使用继承。优先考虑的是把复杂的业务详细划分成不同的模块,然后各个模块组合完成业务流程。

对于以上所述,如果开发经验比较少的人,感觉会比较抽象,不好懂,但是对于开发经验丰富,又想总结自己开发经验的人来说,可能比较有用。

http://www.dtcms.com/a/389366.html

相关文章:

  • C/C++柔性数组
  • 从 LiveData 到 Flow:Android 状态管理的现代化演进
  • 34、模型微调技术实战 - LoRA参数高效微调全流程
  • ASP.NET Core 中基于角色的授权
  • C++ 在 Windows 下实现最基础的 WebSocket 服务端与客户端
  • 并发、分布式和实时设计方法
  • C语言第15讲
  • windows 下使用 bat 批处理运行 Chrome 无头模式刷一波访问量
  • 项目名称:基于Qt框架的跨平台天气预报应用程序​​
  • 王自如重操旧业拆箱iPhone:苹果新机发售旧机发热是惯例……
  • 鸿蒙Next Core File Kit:文件管理的高效安全之道
  • Java-128 深入浅出 MySQL MyCat 分布式数据库中间件详解:架构、功能与应用场景
  • gozero使用gRPC-gateway生成http网关
  • Go语言100个实战案例-项目实战篇:股票行情数据爬虫
  • Python开发最新 PyCharm 2025使用(附详细教程)
  • 【session基础】
  • 客户流失预警中uplift建模案例、入门学习(二)
  • SSH远程管理工具
  • 4644电源芯片的介绍和使用
  • MIPI D-PHY布线规则
  • 《深入理解Java虚拟机》第四章节读书笔记:虚拟机性能监控、故障处理工具
  • ​​[硬件电路-251]:电源相关常见的专业术语
  • 日志中的SQL语句直接转为可执行的SQL
  • Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践
  • Nginx-RTMP-Module开源项目全解析:从基础部署到企业级应用实践
  • 新代系统如何输入期限密码
  • 【C++】STL--stack(栈)queue(队列)使用及其重要接口模拟实现
  • 计算机组成原理:奔腾系列机的虚存组织
  • 架构模式的双雄会:Reactor与Proactor的高并发哲学
  • 【C++】STL详解(八)—stack和queue的模拟实现