01_面向对象的设计原则

news2024/11/25 8:18:43

面向对象的设计原则

参考资料:

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

简介

面对复杂问题如何解决?

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

面向对象

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

分类:

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

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

在这里插入图片描述

重构获得设计模式

在变化点使用设计模式。

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

重构到模式。

敏捷开发。

重构的关键技法

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

面向对象的原则

八大原则

依赖倒置原则(DIP)

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

例子

mainUI与Line和Rect,

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

开闭原则(OCP)

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

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

单一职责原则(SRP)

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

Liskov替换原则(LSP)

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

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

接口隔离原则(ISP)

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

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

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

继承是,类-属,关系

封装变化点

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交换排序--冒泡排序和快速排序

交换,是指根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置 一,冒泡排序 1.基本思想:从后往前(或从前往后)两两比较相邻元素的值,若为逆序(A[i-1] > A[i])&a…

Vivado创建IP核步骤

0、创建一个LED IP核 1、打开Vivado,点击Tasks栏的Manage IP,在弹出的选项框中选中New IP Location... 2、在弹出的界面选择Next 3、在弹出的界面中进行IP核的属性配置,修改系所属的器件和保存路径,其他的保持默认就行&#xff0…

Java(117):读取properties配置文件中文乱码问题解决

1、Edit展示properties后缀文件时乱码 2、读取properties配置文件中文乱码问题解决 2.1、文件存储为UTF-8格式 2.2、读取时设置为UTF-8格式 String enconding "UTF-8"; BufferedReader br new BufferedReader(new InputStreamReader(new FileInputStream(fileP…

VMware安装win10系统(超详细)

目录 一、创建虚拟机 二、选择自定义安装 三、根据自己的主机选择虚拟机的配置 四、光盘映像可以选择稍后安装​编辑 五、 根据自己的光盘映像选择操作系统和版本,因为我的装的是win10 x64,所以安装如下图所示 六、选择存放路径 七、 选择BIOS&#x…

java阻塞队列/kafka/spring整合kafka

queue增加删除元素 增加元素 add方法在添加元素的时候,若超出了度列的长度会直接抛出异常:put方法,若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间,以加入元素offer方法在添加元素时,如果发现队列已满…

FPGA实验三:状态机的设计

目录 一、实验目的 二、实验要求 三、实验代码 1.design source文件部分代码 2.测试文件代码 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 (1)设计好序列检测器 (2)仿真波形(检测11010) 3…

Linux-vim与gdb与make/makefile

三个模式:命令模式 文本模式 底行模式 yum :instell 安装 remove 卸载 gcc -o执行后生成文件命名 gcc 1.c -o fst.out -E预编译 -S汇编 -c生成机器码 Linux 中 静态库:.a;动态库:.so Linux默认动态库,…

Redis的安装,启动,关闭

一,redis安装linux 1,安装gcc环境 yum -y install gcc-c2,上传压缩包到/usr/soft目录,并解压 cd /soft tar -xvf redis-3.2.11.tar.gz3,进入redis-5.0.7目录,使用make命令编译redis [rootlocalhost soft]# cd re…

【DBA课程-笔记】第1章:MongoDB数据库入门

一、MongoDB 概览及新特性 1. MongoDB 简介 目前最流行的NoSQL数据库(NO.1)MongoDB是一个基于分布式文件存储的数据库,由C语言编写,特点是高性能、易部署、易使用、存储数据非常方便,旨在为Web应用提供可扩展的高性能…

企业该如何防止数据泄漏问题

关键词:企业网盘、知识文档管理系统、群晖NAS、数据安全 根据Verizon《2022 数据泄露调查报告》显示,2022年数据泄露事件中82%的违规行为涉及人为因素,勒索软件泄露事件增加了13%,超过过去五年的总和,数据安全已变成关…

【JUC-7】ReentrantLock (可重入锁)基础

ReentrantLock (可重入锁) ReentrantLock实现了Lock接口, 内部通过继承AQS, 实现了一个同步器. 可以通过同步器来创建Condition条件变量, 可以用作容器, 存放不同条件的等待线程. 说明ReentrantLock与AQS的关系 类图: 相对于synchronized, 都支持可重入. 它还具备如下特点: …

【算法练习】24:凯撒密码

一、凯撒密码介绍: 采用替换的方式对英文字母进行处理,将每一个英文字符循环替换为字母表序列中该字符的后面的第三个字符,即循环右移3位。 明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHIJKLMNOPQRSTUV…

微信小程序如何读取本地云存储txt数据,避免乱码

第一步 找到你的txt文件,重命名为json文件 第二步 上传到云存储中,获取File ID 第三步 编写js代码 相关技术文档: https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readFile.html onShow(){wx.cloud.d…

《Redis 核心技术与实战》课程学习笔记(三)

高性能 IO 模型:为什么单线程 Redis 能那么快? Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删…

CDS Core Data Services S4 CDS view--2

7.2 怎么加注释 首先要看懂注释,comparefilter 一般都是true,这样在association 里的join只被验证一次,如果是FALSE就会不停的被验证。 preservekey, 验证和数据库表的key是否一致。 authorizationcheck, 需要验证权限。不过我们没有设access control…

STM32F1 GPIO 简介

GPIO 是控制或者采集外部器件的信息的外设,即负责输入输出。它按组分配,每组 16 个 IO 口,组数视芯片而定。STM32F103ZET6 芯片是 144 脚的芯片,具有 GPIOA、GPIOB、GPIOC、 GPIOD、GPIOE、GPIOF 和 GPIOG 七组 GPIO 口&#xff0…

13---罗马数字转整数

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xf…

【DBA课程-笔记】MongoDB入门到云上开发

课程目的:成为专业MongoDB的DBA nosql第一:MongoDB 一、讲师: 二、课程目录 第1章:MongoDB数据库入门 第2章:MongoDB数据数据查询与分析 第3章:MongoDB数据库核心知识 第4章:MongoDB数据库管…

时间序列预测 | Matlab基于粒子群算法优化门控循环单元(PSO-GRU)的时间序列预测,PSO-GRU时间序列预测,单列数据集

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测 | Matlab基于粒子群算法优化门控循环单元(PSO-GRU)的时间序列预测,PSO-GRU时间序列预测,单列数据集。 优化参数为学习率,隐藏层节点个数,正则化参数,要求2020b及以上版本&#

Redhat7.6安装mysql5.7

环境准备:硬盘剩余空间最少8G,内存剩余最少2G Mysql官网下载地址:https://dev.mysql.com/downloads/mysql/5.7.html 在Mysql官网下载列表中选择需要安装的版本: RedHat7.6安装MySQL5.7 安装之前,先要保证系统环境是干净的,不能存…