如何理解面向对象的OO设计原则和设计模式?

一、如何理解面向对象的编程原则?

在这里插入图片描述

单一职责原则(Single Responsibility Principle)

  • 一个类,应该由一组相关性很高的数据和方法组成。
  • 一个类应该仅有一个引起它变化的原因。

单一职责最难界定的就是关于“职责”的定义,往往需要丰富的经验和对业务的认知程度,这也更加容易引起撕逼大战,似乎任何时候都可以拿它来辩论。如设计 ImageLoader 时,图片缓存功能和图片加载逻辑应该分开写在不同的类中。再比如在 Android 开发的早期 MVC 盛行,什么都往 Activity 里面加(网络请求、Adapter、Bean)导致 Activity 臃肿,这是典型的没有遵守单一职责造成的。

下面是违反单一职责原则的反例:

在这里插入图片描述
在这里插入图片描述

如果这样设计,随着需要实现的不同功能的类越来越多,这样的实现方式就会变成一种继承灾难。
在这里插入图片描述

  • 出现棱形继承,是抽象程度不够的表现。

单一职责原则的关键词:

  • 封装性
  • 职责划分
  • 细化抽象粒度

开闭原则(Open Closed Principle)

  • 对扩展开放,对修改关闭。

当软件需要变化时,尽量通过扩展的方式来实现变化,而不是通过修改已有代码。通常情况下继承是最简单的方式,因为这种方式能保证已经正常 work 的代码不动,但扩展的方式不仅仅是通过继承,更多的是通过持有抽象来拥抱不同的变化。例如 ImageLoader 可以通过持有一个 ImageCache 的接口类型变量,在使用时需要提供不同缓存策略时,set 方法注入 ImageCache 接口的不同实现,达到不修改已有类的目的。

下面是违反开闭原则的例子:

在这里插入图片描述

正确的做法:

在这里插入图片描述

  • 在面向对象语言里,提高代码可维护性的过程,大多数时候都是在消除条件分支语句(if & else )。

开闭原则的关键词:

  • 可扩展性
  • 抽象变化
  • 可维护性
  • 灵活性
  • 稳定性

里氏代换原则(Liskov Substitution Principle )

  • 任何基类出现的地方,子类也同样适用,是多态的体现。
  • 里氏代换,是开闭原则的一种实现方案,也是大部分设计模式的基础。
  • 只有满足里氏代换,子类能替换基类,才能够说明基类是真正能够被复用的。

比如 show(View) 方法传入不同的子类实现 TextView、 ImageView 等,就是使用 View 的不同子类来替换基类 View。再比如 Solider 类持有一把抽象的枪 Gun,使用时再传入具体的实现。因此一般持有抽象的类成员、方法参数都可以认为是里氏替换的例子。里氏替换的核心原理是抽象,且子类必须完全实现父类的方法,否则,应该用组合代替继承。

里氏替换的例子:
在这里插入图片描述
代理模式:
在这里插入图片描述

  • 这里代理者和被代理者都实现了同样的接口,定义代理者时使用基类来引用。只有这样基类才是可复用的。

里氏代换原则的关键词:

  • 可扩展性
  • 抽象
  • 可维护性
  • 复用基类
  • 开闭原则

依赖倒置原则(Dependence Inversion Principle)

  • 依赖抽象接口,而非具体实现。

依赖倒置原则一句话就是:面向接口编程,或面向抽象编程。因为类与类之间一旦依赖于细节,就会产生耦合,例如 ImageLoader 中的缓存策略依赖于某一种具体的实现 MemoryCache 而不是 ImageCache 接口,这样需要更换缓存策略时就会不停的修改 ImageLoader 类。

在这里插入图片描述
在这里插入图片描述

  • 比如,业务类中写了 18 层的继承关系,每一层都是实现类,还依赖了其他实现类,让人理不清关系。

依赖倒置原则的最大好处:降低耦合、隔绝变化

  • 不同业务之间,不被彼此的变化影响;
  • 明确开发、测试人员职责,提高协作效率;
  • 故障隔离,单独业务的故障问题,不应该影响全局。

依赖倒置原则的关键词:

  • 低耦合
  • 隔绝变化
  • 扩展性
  • 灵活性

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

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

相关文章

WEB 3D技术 three.js 法向量演示性讲解

本文 我们来说法向 法向 又叫 法向量 就是 我们一个三维物体 顶点垂直于面 的方向 向量 他的作用 用来做光反射 根据光照的方向 根据面进行反射 我们上文写的这个代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "…

数仓可视化5--superset的部署安装

1、superset简介 Apache Superset 是一个现代的数据探索和可视化平台。它功能强大且十分易用,可对接各种数据源,包括很多现代的大数据分析引擎,拥有丰富的图表展示形式,并且支持自定义仪表盘。 2、安装步骤 2.1、安装Miniconda3 …

GBASE南大通用 ADO.NET EntityFramework 实体框架支持

GBASE南大通用 ADO.NET 驱动支持 EntityFramework 实体框架。 实体框架,可以理解成微软的一个 ORM 产品,用于支持开发人员通过对概 念性应用程序模型编程(而不是直接对关系存储架构编程)来创建数据访问应 用程序,目…

RedHat8、Centos8无法启动网卡解决方案,网卡未加入托管

只针对部分情况,网卡未加入托管导致 虚拟机开启 ifconfig 没有ens33网卡,无法上网 手动启动网卡提示 Connection ens33 is not available on device ens33 because device is strictly unmanaged使用nmtui配置IP信息,无法启动’ens160’网卡…

LCR 174. 寻找二叉搜索树中的目标节点

解题思路: 二叉搜索树一般采用中序遍历(从小到大排列)。 class Solution {int res, cnt;public int findTargetNode(TreeNode root, int cnt) {this.cnt cnt;dfs(root);return res;}void dfs(TreeNode root) {if(root null) return;dfs(ro…

jmeter断言-三种

1.响应断言 substring是指包含就行 不用完全相等 2.json断言 3.持续时间断言

基于深度学习的PCB板缺陷检测系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8 yolov8主要包含以下几种创新:         1. 添加注意力机制(SE、CBAM等)         2. 修改可变形卷积(DySnake-主干c…

Linux:apache优化(3)—— 页面缓存时间

作用:通过 mod_expires 模块配置 Apache,使网页能在客户端浏览器缓存一段时间,以避免重复请求,减轻服务端工作压力。启用 mod_expires 模块后,会自动生成页面头部信息中的 Expires 标签和 CacheControl 标签&#xff0…

AIGC年度回顾!2024向量数据库是否还是AI发展方向之一?

引言 2023 年,是 AI 技术大爆发的一年,从年初到年末,全球关心技术发展的人们见证了一次次的 AI 技术升级,也逐步加深着对 AGI 发展的畅想。而伴随着生成式人工智能的飞速发展,向量数据库以其独特的技术优势逐渐崭露头角…

char 和 varChar 的区别是什么?

大家好,我是伯约,这篇对大家有帮助的话求一个赞,另外文章末尾放了我从月入7k到现在3W的学习资料,大家可以去领一下(无偿)。 CHAR 和 VARCHAR 是最常用到的字符串类型,两者的主要区别在于&#x…

案例073:基于微信小程序的智慧旅游平台开发

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

大文件快速传输解决办法汇总

在数据传输普及的当今时代,文件体量也在不断的突破它”大“的上线,很多企业也在面临着这类大文件快速传输的烦恼,而且这里面的“大”可不是一般意义的几M,几G的文件,它有可能上T级甚至是PB级别、TB级别的大文件,或者是…

LINUX加固之命令审计

一、前言 在LINUX安全范畴中,安全溯源也是很重要的一个环节。对主机上所有曾操作过的命令详细信息需要有一份记录保存,当系统遭受破坏或者入侵,拿出这份记录,可以帮助定位一些可疑动作。 很多系统通常都会配置安全堡垒机&#xff…

二、串行FLASH文件系统FatFs移植

经过上一节的分析,我们对文件系统有一定的理解了,这一节给大家介绍怎么把FatFs文件系统的这些代码移植到STM32S上,然后STM32利用这一些代码或者函数,以文件的格式对FLASH进行读写数据。 实则对diskio.c提供一些函数接口。 首先将…

企业内训系统源码开发实战:搭建实践与经验分享

本篇文章中,小编将带领读者深入探讨企业内训系统的源码开发实战,分享在搭建过程中遇到的挑战与解决方案。 一、项目规划与需求分析 通过对企业内训需求的深入了解,我们可以更好地定义系统架构和数据库设计。 二、技术栈选择 在内训系统开发…

2024年MySQL学习指南(三),探索MySQL数据库,掌握未来数据管理趋势

文章目录 前言7. DML- 增删改数据7.1 添加数据7.2 修改数据7.3 删除数据 8. DQL- 数据的查询操作8.1 基础查询1. 基础查询语法2. 基础查询练习 8.2 条件查询1. 条件查询语法2. 条件查询练习 8.3 排序查询1. 排序查询语法2. 排序查询练习 8.4 聚合函数1. 聚合函数语法2.聚合函数…

部署node.js+express+mongodb(更新中)

1-Linux服务器部署MongoDB 1.升级 yum -y update 2.下载MongoDB安装包 3.上传安装包 上传目录 : /usr/local/ 2-配置MongoDB环境变量并启动 1.配置环境变量全局启动 vi ~/.bash_profile 使用i命令进入编辑模式 添加: export PATH/usr/local/mongodb/bin:$P…

centos 8.0 安装sysbench 1.0.17

序号步骤说明执行命令执行结果备注1 下载并解压sysbench-1.0.17.zip sysbench-1.0.17.zip2安装依赖文件 yum install automake libtool -y yum install /usr/include/libpq-fe.h 3安装sysbench cd sysbench-1.0.17 ./autogen.sh ./configure \ --prefix/sysbench \ --with-pgsq…

Javaweb之Mybatis的基础操作之删除的详细解析

1.3 删除 1.3.1 功能实现 页面原型: 当我们点击后面的"删除"按钮时,前端页面会给服务端传递一个参数,也就是该行数据的ID。 我们接收到ID后,根据ID删除数据即可。 功能:根据主键删除数据 SQL语句 -- 删除…

C语言中关于strcpy函数的理解

strcpy的功能是将源指向的字符串复制到另外一个字符串中 目标指向的数组的大小应该要足够长&#xff0c;避免让源字符串中的数据溢出 关于这个函数的具体用法&#xff0c;我们可以看看下面这个程序 注意&#xff1a;strcpy函数的头文件是<string.h>&#xff0c;我们在用…
最新文章