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

设计模式第一天|了解设计模式、设计模式七大原则

文章目录

  • 了解设计模式
    • 概念
    • 优点
    • 核心原则
  • 设计模式七大原则
    • 单一职责原则
    • 里氏替换原则
    • 依赖倒置原则
    • 接口隔离原则
    • 迪米特法则
    • 开闭原则
    • 合成复用原则

了解设计模式

概念

软件设计模式(Software Design Patten),又称设计模式,是一套被反复使用,多数人只晓的,经过分类编目的,代码设计经验的总结.它描述了在软件设计过程中一些不断重复的问题,以及该问题的解决方案.也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用.其目的是为了提高代码的复用性,代码可读性以及代码的可靠性.

优点

  1. 可以提高程序员的思维能力、编程能力和设计能力。
  2. 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
  3. 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。

核心原则

  1. 找出应用可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
  2. 针对接口编程,而不是针对实现编程
  3. 为了交互对象之间的松耦合设计而努力

设计模式七大原则

单一职责原则

定义

一个类,应当只有一个引起它变化的原因;

即一个类应该只有一个职责。

优点

  1. 唯有专注,才能保证对象的高内聚;
  2. 唯有单一,才能保证对象的细粒度。对象的高内聚与细粒度有利于对象的重用。
  3. 减少代码冗余

俗话说

老师就是用来教书的,学生就是来学习的,而不是边学习边打游戏.

里氏替换原则

定义

如果对一个类型为S的对象o1,都有类型为T的对象o2,使得以S定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T是类型S的子类型。

所有引用基类的地方必须能透明地使用其子类对象。**清晰明确地说明只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,**使用者可能根本就不需要知道父类还是子类;但是反过来则不可以,有子类的地方,父类未必就能适应。

继承

里氏替换原则的重要使用方式就是继承

继承的优点:

  1. 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
  2. 提高代码的可重用性;
  3. 提高代码的可扩展性;
  4. 提高产品或项目的开放性。

缺点:

  • 继承是入侵式的。只要继承,就必须拥有父类的所有属性和方法;
  • 降低代码的灵活性。子类必须拥有父类的属性和方法,使子类受到限制;
  • 增强了耦合性。当父类的常量、变量和方法修改时,必须考虑子类的修改,这种修改可能造成大片的代码需要重构。

作用

从整体上看,继承的“利”大于“弊”,然而如何让继承中“利”的因素发挥最大作用,同时减少“弊”所带来的麻烦,这就需要引入“里氏替换原则”。

俗话说

尽量使用父类去创建子类,想找儿子的话,就先找爸爸

List<String> res = new ArrayList<>();

依赖倒置原则

定义

高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象.

原因

传统的过程性系统的设计办法倾向于高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次。“倒置”原则将这个错误的依赖关系倒置了过来,

作用

  • 依赖导致原则可以降低类间的耦合性
  • 依赖倒置原则可以提高系统的稳定性
  • 依赖倒置则可以减少并行开发引起的风险
  • 依赖倒置原则可以提高代码的可读性和可维护性

重要性

依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合

核心思想

要面向接口编程,不要面向实现编程

俗话说

爹爹负责提出设想,让你去实现,要根据设想,去实现.

接口隔离原则

定义

客户端不应该依赖它不需要的接口。

类间的依赖关系应该建立在最小的接口上。

具体含义

一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。因此使用多个专门的接口比使用单一的总接口要好。

不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构,即不要强迫客户使用它们不用的方法,否则这些客户就会面临由于这些不使用的方法的改变所带来的改变。

俗话说

我要啥你给我啥就完了,比如说小孩是个角色,老人也是个角色,小孩(角色,接口)需要长高(接口方法),老人又不需要.

迪米特法则

定义

迪米特法则又叫最少知识原则,意思是一个对象应当对其他对象尽可能少的了解。

俗话说

我想租房子,没必要知道每个房东的信息,我只需要一个中介来给我介绍就完了,反过来也一样

开闭原则

定义

一个软件实体应当对扩展开放,对修改关闭。(扩展可以,修改不行)

在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即应当可以在不必修改源代码的情况下改变这个模块的行为。

重要性

是面对对象编程中最基础的原则,其他原则(单一职责、里氏替换、依赖倒置、接口隔离、迪米特法则)都是开闭原则的具体形态,

作用

  • 开闭原则提高复用性。
  • 开闭原则提高可维护性。
  • 开闭原则提高灵活性。
  • 开闭原则易于测试。

合成复用原则

定义

又叫组合/集合复用原则.它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现.

重要性

  1. 继承复用的缺点

    继承复用破坏了类的封装性.因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为"白箱"复用 子类与父类的耦合度高.父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护 它限制了复用的灵活性.从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化(说白了就是不符合开闭原则)

  2. 组合复用的优点

    它维持了类的封住性,因为成分对象的内部细节是新对象看不见的,所以这种复用又称为"黑箱"复用 新旧类之间的耦合度降低,这种复用所需要的的依赖较少,新对象存取成分对象的唯一方法是通过对成分对象的接口. 复用的灵活性高,这种复用可以再运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象(符合开闭原则)

俗话说

儿子从父亲这继承来的,这个时候儿子想学点新东西,继承复用就是说让爹先学会,再给儿子教,合成复用就是说直接让儿子去找别人学,合成一下.直接让老爹学太为难老爹了

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HTML+JS+CSS计算练习
  • Go语言并发编程-Context上下文
  • 开始构建我们自己的大语言模型:数据处理部分
  • 「豆包Marscode体验官」 | 云端 IDE 启动 Rust 体验
  • <数据集>木材缺陷检测数据集<目标检测>
  • 【所谓生活】马太效应
  • ABAP使用SQL直接更新数据库与使用IN UPDATE TASK的区别
  • 【ARMv8/v9 GIC- 700 系列 2 -- GIC-700 上电控制寄存器 GICR_PWRR】
  • 基于Gunicorn、Flask和Docker的高并发部署
  • 嵌入式物联网在医疗行业中的应用——案例分析
  • Go语言并发编程-Channel通信_2
  • Leetcode 383. 赎金信
  • 社交内容电商的进化与AI智能名片的新兴角色
  • 最新开源的PDF版面分析工具 PDF-Extract-Kit
  • HC05主从一体蓝牙模块的裸机使用——单片机<-->蓝牙模块
  • [LeetCode] Wiggle Sort
  • [数据结构]链表的实现在PHP中
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • canvas 高仿 Apple Watch 表盘
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • iOS 系统授权开发
  • JavaScript的使用你知道几种?(上)
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • NSTimer学习笔记
  • STAR法则
  • Swift 中的尾递归和蹦床
  • vue-loader 源码解析系列之 selector
  • Zepto.js源码学习之二
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 实战|智能家居行业移动应用性能分析
  • 手写双向链表LinkedList的几个常用功能
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 我与Jetbrains的这些年
  • - 转 Ext2.0 form使用实例
  • k8s使用glusterfs实现动态持久化存储
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #### go map 底层结构 ####
  • (2)STL算法之元素计数
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Oracle)SQL优化技巧(一):分页查询
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (windows2012共享文件夹和防火墙设置
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (强烈推荐)移动端音视频从零到上手(下)
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)visual stdio 书签功能介绍
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .describe() python_Python-Win32com-Excel
  • .NET 8.0 发布到 IIS
  • .net dataexcel 脚本公式 函数源码