01_面向对象的设计原则

面向对象的设计原则

参考资料:

  • 视频
  • 书籍 《设计模式:可复用面向对象软件的基础》

简介

面对复杂问题如何解决?

  • 分解:分而治之,大问题分解成小问题。
  • 抽象:忽视非本质的细节,处理泛化和理想化的对象模型。

面向对象

  • 从语言实现看,是代码和数据的封装
  • 是一系列的公共接口
  • 某种拥有责任的抽象

分类:

  • 创建型
  • 结构型
  • 行为型

从封装变化角度对模式分类:

在这里插入图片描述

重构获得设计模式

在变化点使用设计模式。

不要上来就使用设计模式。

重构到模式。

敏捷开发。

重构的关键技法

  • 静态 到 动态
  • 早绑定 到 晚绑定
  • 继承 到 组合
  • 编译时依赖 到 运行时依赖
  • 紧耦合 到 松耦合

面向对象的原则

八大原则

依赖倒置原则(DIP)

  • 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)。
  • 抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)。

例子

mainUI与Line和Rect,

MainUi不应该依赖于Line和Rect,而是应该依赖于抽象(Shape),Shape是对Rect和Line的抽象,Shape不应该依赖于Rect和Line的具体实现。

开闭原则(OCP)

  • 对扩展开放,对更改封闭
  • 类模块应该是可以扩展的,但是不可以修改。

可用增加Circle的实现,但不改之前的代码。

单一职责原则(SRP)

  • 一个类应该仅有一个引起它变化的原因。
  • 变化的方向隐含着类的责任。

Liskov替换原则(LSP)

  • 子类必须能够替换他们的基类(IS-A)
  • 继承表达类型的抽象。

简单来说,是基类出现的地方都可以用子类替换掉,(继承)

接口隔离原则(ISP)

  • 不应该强迫客户程序依赖它们不用的方法
  • 接口应该小而完备

优先使用组合,而不是继承

  • 继承类通常为“白箱复用”,对象组合通常为“黑箱复用”
  • 继承某种程度上破坏了封装性,子类父类耦合度高
  • 而对象组合则只要求被组合的对象具有良好定义的接口耦合度低

继承是,类-属,关系

封装变化点

  • 使用封装来创建对象之间的分界层,让收集者可用在分界点的一侧进行修改,而不对另一侧产生不良影响,从而实现松耦合

针对接口编程,而不针对实现编程

  • 不将变量类型声明为某个特定的具体类,而是声明为某个接口
  • 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口
  • 减少系统中各部分的依赖关系,从而实现“高内聚,松耦合”的类型设计方案。

对接口编程,而不针对实现编程

  • 不将变量类型声明为某个特定的具体类,而是声明为某个接口
  • 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口
  • 减少系统中各部分的依赖关系,从而实现“高内聚,松耦合”的类型设计方案。

接口标准化,是一个产业强盛的标志。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/34744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

卷积神经网络--猫狗系列之下载、导入数据集

(由于是学习,所以文章会有一些报错及解决办法) 在Kaggle()获取数据集:(没有账号先去注册一个账号,在注册时可能会出现的问题见Kaggle注册出现一排“Captcha must be filled out.”!) https://www.kaggle.…

人工智能在航天领域中有哪些应用?

随着科技的不断进步,人工智能已经成为各个领域中的重要驱动力。在航天领域中,人工智能的应用正日益展现出巨大的潜力。航天领域对精确性、自动化和高效性的需求,使得人工智能成为实现这些目标的关键技术之一。人工智能正在以其独特的优势和算…

Linux中Docker详细安装说明

1.准备环境 说明:准备Linux系统centos7版本(以上) 2.切换管理模式 说明:输入一下命令,然后回车,输入密码。 su – 3.更新yum 说明:为了保证doker能够给顺利安装,那么更新一下;如果没有也可以…

【SpringMVC】| 报文信息转换器HttpMessageConverter

目录 框架搭建 报文信息转换器HttpMessageConverter 1. RequestBody注解 2. RequestEntity类型 3. RequestBody注解(常用) 重点:SpringMVC处理json 重点:SpringMVC处理ajax 重点:RestController注解 4. Respo…

day1-若依项目前后端分离的初步使用

响应式布局: 做好的产品能在pc端,手机,平板都能正常浏览 开发项目两种方式 1.自己从0开始写代码 2.在若依中下载拥有基础功能的源码 若依使用的mysql版本 mysql5.7 导入别人的项目如何操作 若依项目下载地址**:https://gitee.com/y_project/RuoYi-Vue.git** 可以使用揉…

AIPRM for ChatGPT 提示词模板扩展工具实践

(1)基本介绍 AIPRM for ChatGPT是一个Chrome浏览器扩展程序,基于Chromium内核开发的浏览器都可以使用该扩展,比如微软的Edge浏览器等。 在AIPRM的帮助下,我们可以在ChatGPT中一键使用各种专门为网站SEO、SaaS、营销、…

Transformer(四)--实现验证:transformer 机器翻译实践

转载请注明出处:https://blog.csdn.net/nocml/article/details/125711025 本系列传送门: Transformer(一)–论文翻译:Attention Is All You Need 中文版 Transformer(二)–论文理解:transformer 结构详解 Transformer(三)–论文实…

idea搭建springmvc

Spring MVC是一种基于MVC模式的框架,它是Spring框架的一部分。它提供了一种更简单和更有效的方式来构建Web应用程序。它提供了一系列的功能,可以帮助您更快地构建Web应用程序,如控制器,视图,模型,数据绑定&…

如何用Airtest脚本无线连接Android设备?

1. 前言 之前我们已经详细介绍过如何用AirtestIDE无线连接Android设备: 手把手教你用AirtestIDE无线连接手机! ,它的关键点在于,需要先 adb connect 一次,才能点击 connect 按钮无线连接上该设备: 但是有很…

20230705点亮STC32G实验箱9.6(STC32G12K128)开发板的跑马灯LED(深入了解)

08第六集:LED闪烁第六集:LED闪烁和花式点灯上和花式点灯上.mp4 09第六集:LED闪烁和花式点灯下.mp4 【大文哥学习32位8051】20230704【冲哥视频】第六集的晶振时钟的学习困惑 2023/7/5 17:36 delay_ms(3000); 刷机的时候如果使用11.0592M的Fos…

【LeetCode周赛】2022上半年题目精选集——思维题

文章目录 2211. 统计道路上的碰撞次数(栈 || 脑筋急转弯)解法1:自己想的——使用栈解法2——思维:去掉左右两边往左右开的车代码写法1——找左右端点代码写法2——正则表达式去除流处理api补充:replaceAll() 和 正则表…

python图像处理实战(三)—图像几何变换

🚀写在前面🚀 🖊个人主页:https://blog.csdn.net/m0_52051577?typeblog 🎁欢迎各位大佬支持点赞收藏,三连必回!! 🔈本人新开系列专栏—python图像处理 ❀愿每一个骤雨初…

c语言修炼之猜数字游戏

前言 小伙伴们&#xff0c;今天来学习猜数字游戏叭&#xff01;废话不多说&#xff0c;让我们一起开始学习叭! 思路&#xff1a; 一打开游戏就出现一个菜单然后可以让我们选择是进入游戏还是退出游戏&#xff01; #include<stdio.h> void menu() {printf("*****…

【MySQL】基本查询之表的增删改查

【MySQL】表的增删改查 一、插入操作----insert1.1 简单插入1.2 插入时是否更新----ON DUPLICATE KEY UPDATE1.3 插入时替换----REPLACE 二、查询----select2.1 简单查询与去重2.2 基本查询----where条件2.2.3 案列演示 2.4 排序----order by 三、修改操作----update四、删除--…

Lua学习笔记:浅谈table的实现

前言 本篇在讲什么 Lua中的table的实现 本篇适合什么 适合初学Lua的小白 本篇需要什么 对Lua语法有简单认知 依赖Sublime Text编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &…

大数据Doris(五十三):MySQL Dump 导出

文章目录 MySQL dump 导出 一、Dump导出案例 二、注意事项 MySQL Dump 导出 mysqldump是一个常用的 MySQL 数据库备份工具&#xff0c;它可以将 MySQL 数据库中的数据导出为 SQL 格式的文件&#xff0c;从而实现对数据的备份、迁移和恢复等操作。Doris 在0.15 之后的版本已…

青岛大学_王卓老师【数据结构与算法】Week04_03_双向链表_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

Spring Boot 集成 Redisson分布式锁

Redisson 是一种基于 Redis 的 Java 驻留集群的分布式对象和服务库&#xff0c;可以为我们提供丰富的分布式锁和线程安全集合的实现。在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面&#xff0c;例如分布式锁、分布式集合、分布式事件发布和订…

Oracle数据库软件安装与卸载

Oracle数据库软件安装与卸载 实验目的及要求 学习Oracle12c数据库服务器软件和客户端软件的安 装与卸载,掌握客户端服务名的设置,建立客户端与服务器的网络连接,熟悉windows操作系统中Oracle相关服务的操作。理解数据库管理的基本架构。 &#xff08;1&#xff09;熟悉Oracle…

基于SpringBoot+SpringCloud+vue的智慧养老平台设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…