设计模式: 面向对象思想,软件设计原则与设计模式之间的关系

探索设计模式的魅力:深入理解面向对象设计的深层原则与思维 软件设计原则是指在软件开发过程中,通过一系列指导性的原则来指导设计决策和编码实践。这些原则旨在提高软件系统的质量,使其具有可维护性、可扩展性、可重用性和可测试性。几个重要性:可维护性、可扩展性、可重用性、可测试性和降低系统复杂度。软件设计原则是提高软件系统质量和可维护性的基石。遵循这些原则可以使得代码更加清晰、灵活和可靠,提高开发效率和软件质量,减少后期维护成本。同时,它们也为团队合作和团队成员共同理解代码提供了共同的规范和指导。 阅读详情

面向对象

  • 我们知道一般编程思想有:面向过程,面向对象,面向切面编程,在软件开发中比重最大的就是面向对象编程了
  • 在面向对象中有一个"类"的概念,其实它就是模板
  • 面向对象的三要素:继承 封装 多态
    • 继承:子类继承父类(公共类)
    • 封装: 数据的权限和保密, public, protected, private, 减少耦合,保护特定数据, 数据,接口的权限管理, ES6中不支持, _开头的属性是private
    • 多态: 同一接口不同实现, 比如ts中的重写和重载, 保持子类开放性和灵活性,面向接口编程
  • 拿js应用来举例
    • jQuery是一个class
    • $(‘p’)是jQuery的一个实例
  • 为何使用面向对象
    • 程序执行:顺序,判断,循环 - 结构化
    • 面向对象 - 数据结构化,对于计算机,结构化才是最简单的
    • 编程应该 简单 & 抽象
  • 面向对象是一种思想,实现面向对象需要用到设计模式

软件设计中的设计与设计哲学

1 )何为设计?

  • 描述:按照一种思路或标准来实现功能
  • 结合《UNIX/LINUX设计哲学》
  • 功能相同,可以有不同设计方案来实现
  • 伴随需求增加, 设计的作用才能体现出来

2 ) UNIX/LINUX设计哲学

  • 准则1: 小即美
  • 准则2: 让每个程序只做好一件事
  • 准则3: 快速建立原型
  • 准则4: 舍弃高效率而取可移植性(通用)
  • 准则5: 采用纯文本来存储数据(方便人读,可读性)
  • 准则6: 充分利用软件的杠杆效应(软件复用)
  • 准则7: 使用shell脚本来提高杠杆效应和可移植性
  • 准则8: 避免强制性的用户界面
  • 准则9: 让每个程序都称为过滤器
  • 小准则: 允许用户定制环境
  • 小准则: 尽量使操作系统内核小而轻量化
  • 小准则: 使用小写字母并尽量简短
  • 小准则: 沉默是金,比如输出数字,有缺省值-1,而非字符串
  • 小准则: 各部分之和大于整体,以小的个体组成大的整体
  • 小准则: 寻求90%的解决方案,产品面向用户不可能满足100%用户,只需要90%即可

3 ) 演示:沉默是金+每个程序成为过滤器

ls
ls | grep *.json
ls | grep *.json | grep 'package' # 这里可能输出 package.json
ls | grep *.json | grep 'package1' # 这里啥都没输出
ls | grep *.json | grep 'package' | wc -l # 这里是0
ls | grep *.json | grep 'package1' | wc -l # 如果在 ls | grep *.json | grep 'package1' 输出结果为字符串no files, 这里就是1了

4 ) SOLID 5大设计原则

  • S 单一职责原则
  • O 开放封闭原则
  • L 里氏置换原则
  • I 接口独立原则
  • D 依赖倒置原则:编程要依赖接口而非具体实现

4.1) S原则(单一职责原则)

  • 永远都不应该有多于一个原因来改变某个类
  • 对于一个类而言,应该仅有一个引起它变化的原因
  • 如果一个类拥有了两种职责,那就可以将这个类分成两个类
  • 如登录验证:验证用户名和密码,应该分开写两个方法
  • 一个程序只做好一件事
  • 如果功能过于复杂就拆分开,每个部分保持独立

4.2) O原则(开放封闭原则)

  • 对扩展开放,对修改封闭
  • 封装的类应该便于扩展,但不要去修改类
  • 增加或改动需求时,扩展新代码,而非修改已有代码,尽量用继承或组合的方式来扩展类的功能,而不是直接修改类的代码
  • 这是软件设计终极目标
  • 举例:
    • 需要修改已有代码,成本非常之高,对测试人员巨大的压力
    • 多人开发,多个需求,需要修改已有代码,会有很多冲突问题

4.3) L原则(里氏置换原则)

  • 父类在使用的过程中,一定能够被子类替换或覆盖
    • 在使用方法的时候,如果将父类的引用,换为子类的引用,对整体程序设计来说是没有任何影响的
    • 在面向对象中会出场率很高:比如继承和多态
    • 但是在前端函数式编程中,出场率和关注度并不高
  • 父类能出现的地方子类就能出现
  • js中使用较少(弱类型 & 继承使用较少)

4.4) I原则(接口独立原则)

  • 一个类与另一个类的关联,应尽量依赖于尽可能小的接口
    • 不需要对外暴露,没有实际意义的接口,用户不应该依赖它不需要的接口
    • 当对外暴露接口时,如果一个接口是非必要的,应该删除,不应该存在
  • 保持接口的单一独立, 避免出现 “胖接口”,尽量不要出现一个函数能解决很多问题,但不是100%不能出现
  • js中没有接口(ts中例外),使用较少
  • 类似于单一职责原则,这里更关注接口(函数或方法)

4.5) D原则(依赖倒置原则)

  • 高层模块不应该依赖于底层模块,他们应该依赖于抽象
  • 抽象不应该依赖细节,细节应该依赖抽象
  • 应该面向接口编程,不应该面向实现类编程
  • 接口中限定了一部分类型,实现类在实现的时候,接口中所有的方法和属性都需要用到
  • 实现类中有一些自己实现的方法,是不确定的,不需要关注这部分的实现
  • 不是说所有类都要有一个对应的接口,而是说,如果有接口,那就尽量使用接口编程
  • 面向接口编程,依赖于抽象而不依赖于具体
  • 使用方只关注接口而不关注具体类的实现
  • JS中使用较少,没有接口 & 弱类型,但是TS弥补了这个缺陷

5 ) 用前端中的Promise来说明SO

function loadImg(src) {
    return new Promise((resolve, reject)=>{
        var img = document.createElement('img')
        img.onload = function() {
            resolve(img)
        }
        img.onerror = function() {
            reject('图片加载失败')
        }
        img.src = src
    })
}

var src = 'http://www.xxx.com/x.png'
loadImg(src)
.then((img)=>{
    return img
})
.then((img)=>{
    console.log('img.height', img.height)
}).catch((ex)=>{
    // 统一捕获异常
    console.log(ex)
})
  • 单一职责体现,每个then只做一件事,如果想做另一件事,需要添加一个新的then
  • 开放封闭体现,如果有新需求,只需要添加新的then即可
  • 真正应用时候可通过模块化将各个逻辑拆分到不同文件中

6 )补充原则

  • 最少知识原则

    • 只与你最直接的对象交流
    • 这里最直接的对象是指与自己有直接关联的对象
    • 可以用一句话总结,就是高内聚和低耦合:将我们的代码和其他有联系的代码进行最少的关联, 在做系统设计的时候,尽量减少依赖关系
  • 组合/聚合复用原则

    • 日常程序设计的时候,当扩展类功能时,应优先考虑组合,而非继承,组合优于继承
      • 组合的灵活性比继承的要大很多
      • 此原则在23种设计模式中频繁使用,如代理,装饰,适配器模式
  • 无环依赖原则

    • 如果A模块依赖B,B依赖C,C依赖A 此时构成循环依赖
    • 应避免出现此种设计,如果出现这种情况,应该使用中介者模式来解决
  • 共同封装原则

    • 应该将易变的类放在同一个包中,将变化隔离出来
    • 该原则是基于开放封闭原则中诞生的一个原则
  • 共用重用原则

    • 如果重用了包中的一个类,那也就相当于重用了包中的所有类,也就是父类,基类
    • 我们要尽可能减少包的大小
  • 依赖注入原则

    • 又名好莱坞原则:Don’t call me, I’ll call you.
    • 也称为控制反转原则
    • 不需要主动创建对象,而是由容器帮我们来创建并管理这些对象
    • 比如require或import引入的模块,就是依赖注入
  • 其他设计原则

    • 不重复原则:不要让重复代码到处都是,要让他们足够重用,所以进可能地封装
    • 保持它简单与傻瓜
      • 保持系统界面简洁,功能实用,操作方便
      • 入参和出参不应该太多,了解其作用和副作用
    • 高内聚,低耦合
      • 模块内部需要做到高内聚,模块之间要做到低耦合
    • 关注点分离
      • 将一个复杂问题,分解为多个简单问题,逐一解决
      • 也就是分而治之,如何进行分离是关键
    • 你不需要它
      • 完美架构设计者:设计一种程序可包容所有错误,可更好应对更好发展,做了大量适配所有应用的代码,付出远大于收益
      • 不要一开始就把系统设计的非常复杂,不要陷入过度设计的深渊
      • 应该让系统开开始的时候,设计足够简单,但又不失扩展性

7 ) 从设计到模式

  • 设计:设计原则
  • 模式:总结出来的模板,可效法的固定的东西
  • 设计和模式分开,从设计到模式
设计模式(三)——面向对象设计原则 设计模式需要遵循基本的软件设计原则。可维护性(Maintainability)和可复用性(Reusability)是衡量软件质量的重要的两个属性: 可维护性:软件能够被理解、改正、适应及扩展的难易程度 可复用性:软件能够被复用的难易程度 面向对象设计的原则是支持可维护性复用,一方面需要实现设计方案或代码的复用,另一方面要保证系统易于扩展和修改,具有良好的可维护性。面向对象设计原则蕴含在各个设计... 阅读详情

相关推荐

Qt实战:用QTreeView+QStandardItemModel实现多级多列文件浏览器(附完整代码)

本文深入探讨了使用Qt的QTreeView与QStandardItemModel构建多级多列文件浏览器的完整实践。通过分析模型/视图框架的优势,详细演示了从基础框架搭建、模拟数据填充,到对接真实文件系统实现懒加载的全过程。文章还涵盖了自定义委托、多列排序、右键菜单等高级定制技巧,并提供了性能优化建议和完整的代码示例,帮助开发者打造功能强大且高效的工业级文件管理界面。

weixin_29021291的博客 424

软件设计——面向对象的七大原则

软件设计模式和设计原则是成为一个软件架构师的基本功,较好的理解这些基础知识无疑是十分重要的。在这篇文章中荔枝将会比较详细梳理一下面向对象的七大原则,大家可以先看看这部分内容再去学习设计模式会比较好哈哈哈哈~~~

荔枝当大佬的博客 589

Power Automate 最常用的十大场景以及解决方案

3.2 获取指定主题含有附件邮件,然后读取csv附件内容,插入数据库,调度执行存储过程,最后通过Power automate 发送paginated report 特殊格式报表给发件人。Power Automate 作为微软推出的自动化工作流工具,其适用场景非常广泛,尤其在数据库查询自动化方面能显著提升效率。2.8发送邮件,把生成csv文件当作附件,把生成html当作邮件内容在邮件boty展示。3.1 读取数据库数据,定时发送预警邮件并抄送附件和展示内容在邮件中。:已有微软产品栈,需快速实现部门级自动化。

qq_24388807的博客 3710

面向对象设计的六大原则和设计模式UML图

设计模式 文章目录一、面向对象的六大设计原则1、指导思想2、设计原则3、总结二、设计模式1、分类2、UML类图2.1 创建型模式2.2 结构型模式2.3 行为型模式总结 一、面向对象的六大设计原则 1、指导思想 可维护性 Maintainablity 修改功能,需要改动的地方越少,可维护性越好 可复用性 Reusability 代码可被重复使用 写出自己总结的类库 可扩展性 Extensibility/Scalability 添加功能,无需修改原来代码 灵活性 Flexibility/mob

weixin_41832813的博客 1080

中国银行信息科技岗位笔试

收到笔试只剩四天了,收集的资料,后续会更新

weixin_46050242的博客 4598

内窥镜胶囊(胶囊内镜)硬件方案

内窥镜胶囊(胶囊内镜)硬件方案 前言 说明:该方案为作者2018年上半年完成的第一版,后来搁置了一段时间,才重启这个项目。目前(2020.07)第二版已经快要完成。[联系v:1#7#6#3#3#3#5#0#8#7#0]先给一下第一版和第二版的基本参数。 第一版: 续航时间:3h 帧率:0.5fps 尺寸:12mm * 25mm 角度:45° 第二版: 续航时间:12h 帧率:2-6fps 尺寸:9.8mm * 25mm 角度:130° 第一版属于尝试版,整体方案不是很成熟。第二版这个数据就非常优秀了。我拿了

CrekerLi的博客 4781

面向对象思想和设计模式

Part 1面向对象的程序设计思想和软件设计模式 1.面向对象三大特性 封装 继承 多态(也有多加一个抽象的) 1.1什么是封装? 回答:简单讲封装就是将对象包装成一个高度自治和相对封闭的个体。 对象的属性由对象的方法来进行调用,对数据的访问只能通过已定义的界面。如私有变量,用set,get方法获取。 1.2继承??? 回答: 继承就是子类具有父类的方法和属性,继承可以重用父类代码。 ...

qq_41829246的博客 315

STM32玩转C++:从Arduino库到HAL库的封装思路(Clion环境配置指南)

本文介绍了如何在STM32开发中使用C++封装HAL库,从Arduino风格过渡到更高效的开发方式。通过Clion环境配置指南和详细的代码示例,展示了如何利用C++的面向对象特性简化GPIO、UART等外设操作,提升代码可读性和开发效率。特别适合嵌入式开发者和从Arduino转向STM32的开发者。

weixin_33737134的博客 336

设计模式之面向对象七大基本原则

PS一句:最终还是选择优快云来整理发表这几年的知识点,该文章平行迁移到优快云。因为优快云也支持MarkDown语法了,牛逼啊!概述在运用面向对象的思想进行软件设计时,需要遵循的原则一共有7个,他们是:1. 单一职责原则(Single Responsibility Principle)每一个类应该专注于做一件事情。2. 里氏替换原则(Liskov Substitution Principle)超

工匠若水 2万+

Windows10完美驱动Apple Studio Display:从雷电接口到亮度调节全攻略

本文详细介绍了如何在Windows10系统上完美驱动Apple Studio Display,涵盖雷电接口兼容性、亮度调节及色彩管理等关键问题。通过实测对比不同转接方案和显卡兼容性,推荐使用贝尔金VR线和NVIDIA GTX-1660显卡,并提供了BootCamp驱动安装和亮度调节的终极解决方案,帮助用户实现最佳显示效果。

elastic6hunter的博客 1123

基于R-CNN深度学习的生活垃圾检测与分类系统:数据集、模型和UI界面的完整实现

我们将使用一个公开的垃圾分类数据集来训练我们的模型。一个常见的数据集是TACO数据集(Trash Annotations in Context),该数据集包含多种垃圾类别,适用于垃圾分类任务。TACO数据集中的图像标注了垃圾的类别以及其在图像中的位置,适合用于目标检测任务。图片数据:每张图片中包含不同种类的垃圾。标签文件:每个图像有相应的标签文件,标注了图像中垃圾的类别、位置(通常为边界框坐标)等信息。dataset/images/image1.jpgimage2.jpg......其中,

YOLO 1103

面向对象思想设计原则及常见设计模式

面向对象思想设计原则 •在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设计原则 •单一职责原则 •开闭原则 •里氏替换原则 •依赖注入原则 •接口分离原则 •迪米特原则 l单一职责原则 •其实就是开发人员经常说的”高内聚,低耦合” 也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个。在设计

modelsetget的博客 2245

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Java设计模式】软件设计七大原则

文章目录软件设计原则的分类开闭原则依赖倒置原则单一职责原则接口隔离原则迪米特法则(最少知道原则)里氏替换原则合成/复用原则(组合/复用原则) 软件设计原则的分类 开闭原则 依赖倒置原则 单一职责原则 接口隔离原则 迪米特法则(最少知道原则) 里氏替换原则 合成/复用原则(组合/复用原则) 在设计模式中会有这7中软件设计原则的体现,但是值得注意的是这7钟设计原则在设计模式中的使用是有取舍的,有...

明月沉江春雾晓 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

设计模式之类之间的关系和六大原则

设计模式之类之间的关系和六大原则1 类之间的关系1.1 继承关系1.2 实现关系1.3 依赖关系1.4 关联关系1.5 聚合关系1.6 组合关系1.7 总结2 六大原则2.1 单一职责原则2.2 开放-封闭原则2.3 依赖倒转原则2.4 里氏代换原则2.5 接口隔离原则2.6 迪米特法则3 各种设计模式 1 类之间的关系 类与类之间的关系大概有6种,要看懂UML图,首先需要了解这几种关系。 1.1...

konglongdanfo的博客 4085

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

一文搞懂什么是面向对象编程思想与设计原则

篇幅较长,请耐心读完,小先会简明扼要地通俗讲解 文章结构1.软件设计的问题1.1 软件有什么问题?1.3 怎样设计软件?2. 统一建模语言-UML2.1 来历2.2 UML采用的方法论-4+1视图2.3 类图3. 说面向对象前先讨论需求变更3.1 一个例子3.2 为何好的程序员拥抱需求变化4. 面向对象设计目标4.1 高内聚4.2 低耦合4.3 如何高内聚、低耦合5. 面向对象7大设计原则5.1 ...

谭小先的博客 3212

设计模式背后的设计原则和思想

理解设计模式背后的设计原则和思想

WZX17307935391的博客 1810

java设计模式day01--(类之间的关系、软件设计原则、单例设计模式)

用户可以根据自己的喜爱更换自己的输入法的皮肤,也可以从网上下载新的皮肤。双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。上面代码可以看到已经组装了一台电脑,但是似乎组装的电脑的cpu只能是Intel的,内存条只能是金士顿的,硬盘只能是希捷的,这对用户肯定是不友好的,用户有了机箱肯定是想按照自己的喜好,选择自己喜欢的配件。

m0_62388400的博客 1515

软件设计思想

软件设计看似浩如烟海的知识背后,设计思想也显得那么朴实无华。虽说朴实无华,但有不失优雅。

穿越临界点的博客 1789

设计模式与设计原则简介——及其设计模式学习方法

本文主要是关于【设计模式与设计原则的关系】以及【常见的六种面向对象设计原则】介绍说明

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1389

面向对象设计原则与23种设计模式

23种设计模式优秀贴汇总: 1、【23种设计模式全解析】 2、【软件设计模式】 3、【面向对象设计原则与模式(JDK中模式)】 4、【23种设计模式(推荐)】 5、【设计模式】 6、【设计模式汇总】 ...

聚沙成塔 5431

【设计模式系列24】GoF23种设计模式总结及软件设计7大原则

设计模式总结及软件设计七大原则前言软件设计7大原则开闭原则(Open-Closed Principle,OCP)里氏替换原则(Liskov Substitution Principle,LSP)依赖倒置原则(Dependence Inversion Principle,DIP)单一职责原则(Single Responsibility Principle,SRP)接口隔离原则(Interface Segregation Principle,ISP)迪米特法则(Law of Demeter,LoD)合成复用原则

zwx900102的博客 2927

设计模式概述和七大软件设计原则

设计模式概述、七大软件设计原则

qq_51774011的博客 1519

Java设计模式超详解(一:设计模式概述、UML图、软件设计原则、创建者模式)

本文介绍了软件设计模式的概念、分类和应用,强调其在提高软件开发效率、代码复用性和可维护性方面的重要性。文章首先从设计模式的起源开始,讲述了其从建筑领域转向软件工程的过程,并提到经典的《设计模式:可复用面向对象软件的基础》一书及其23种设计模式。接着,文章详细讲解了设计模式的三大类别:创建型模式、结构型模式和行为型模式,并逐一阐述了UML图在设计中的作用,尤其是类图的表示方式及类之间的各种关系(如继承、聚合、依赖等)。随后,文章深入探讨了软件开发中的六大设计原则,包括开闭原则、里氏代换原则、依赖倒转原则等

LLM | Agent | RAG | Java 3029

面向对象的设计模式与原则

在面向对象的语言中,继承是必不可少的、非常优秀的语言机制。它存在非常明显优缺点。

SQWH_SSGS的博客 1155

面向对象设计模式与原则

设计模式简介每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。-- Christopher Alexander  设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。 GoF23 种设计模式   历史性著作《设计模式:可复用面向对象软件的

首席技术执行官CTO(Chief Technology Officer)|技术总监--邓斌博客 1241
上一篇: 前端小技巧: TS实现new出一个对象的内部过程
下一篇: 设计模式: 软件设计的分层与软件开发注意事项
Wang's Blog
博客等级 码龄12年 7438粉丝 2422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值