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

news2024/11/18 23:28:50

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

在这里插入图片描述

单一职责原则(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.coloradmin.cn/o/1358898.html

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

相关文章

H5 - - - - - 获取图片exif相关信息

1. EXIF是什么 【可交换图像文件格式】:(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。 2. EXIF 相关标识 { ApertureValu…

python封装接口自动化测试套件

在Python中,我们可以使用requests库来实现接口自动化测试,并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例: 首先,我们需要安装所需的库: pip install requests …

JSUDO|加速度与阿里云合作云产品

电讯:深圳市加速度软件开发有限公司【加速度jsudo】,与阿里云计算有限公司(简称“阿里云”)达成合作,双方将在电商、企业管理等应用软件领域就云产品和应用软件更深层次合作。 加速度软件长期以来,一直与阿…

群太多,有什么办法可以定时、批量、标签分类群发的吗?

你或许会遇到微信群组过多而导致管理困难等问题吗?对于如何高效地管理众多微信群组,实现分类管理同样具有不可忽视的重要性。 实际上,对此问题小编收到了部分朋友的疑问:“既然可以为微信好友添加标签,那为何不能为微…

如何查找iPhone中所有的应用程序

​ ​ Apple 的 App Store 共有约 200 万个适用于 iPhone 和 iPad 的应用程序。如果您像我们一样,您的 iOS 或 iPadOS 设备上可能有数十个应用程序,但没有机会将它们全部整理好。您很容易忘记主屏幕上应用程序图标的位置。 幸运的是,iPhone…

运用AI翻译漫画(二)

构建代码 构建这个PC桌面应用,我们需要几个步骤: 在得到第一次的显示结果后,经过测试,有很大可能会根据结果再对界面进行调整,实际上也是一个局部的软件工程中的迭代开发。 界面设计 启动Visual Studio 2017, 创建…

VUE部署到IIS中报404错误解决方案-配置URL重写

VUE部署到IIS中报404错误解决方案-配置URL重写 第一步,Windows服务器中开启IIS 可承载的web核心 1、添加角色和功能中安装iis 可承载web核心 第二步,下载url重写工具 官方网站下载地址: https://www.iis.net/downloads/microsoft/url-rewrit…

ASUS华硕ROG幻14笔记本2023款G14 GA402XV原装出厂Win11系统

华硕幻14锐龙R9-7940HS笔记本电脑原厂Windows11.22H2系统 适用型号:GA402XU、GA402XV、GA402XI、GA402XY、GA402XZ 链接:https://pan.baidu.com/s/1sMva1u7D8uFoGnm2Hjrdug?pwdho91 提取码:ho91 原厂系统自带所有驱动、出厂主题壁纸、…

java: 写入数据到HBase

一、添加依赖 <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hbase</groupId><art…

css 编写圆角矩形只有左侧一半的样式

实现该样式&#xff1a;尺寸大小可自由调整修改 <div class"abc"></div>.abc{width: 50px;height: 300px;border: 1px solid red;border-right: none;border-top-left-radius: 10px;border-bottom-left-radius: 10px;}

决策树--分类决策树

1、介绍 ① 定义 分类决策树通过树形结构来模拟决策过程&#xff0c;决策树由结点和有向边组成。结点有两种类型&#xff1a;内部结 点和叶结点。内部结点表示一个特征或属性&#xff0c;叶子节点表示一个类。 ② 生成过程 用决策树分类&#xff0c;从根结点开始&#xff…

智算中心基石-AI算力池化

以智算中心为代表的算力基础设施能够有效促进AI产业化和产业AI化&#xff0c;是支撑数字经济发展的重要基础底座。为了让AI 真正地赋能到千行百业&#xff0c;并推动产业数字化转型发展&#xff0c;智算中心要具备对外提供高性价比、普惠、安全算力资源的能力&#xff0c;使AI算…

CSIG青年科学家会议圆满举行,合合信息打造智能文档处理融合研究新范式

近期&#xff0c;第十九届中国图象图形学学会青年科学家会议&#xff08;简称“会议”&#xff09;在广州召开。会议由中国图象图形学学会&#xff08;CSIG&#xff09;主办&#xff0c;琶洲实验室、华南理工大学、中山大学、中国图象图形学学会青年工作委员会承办。会议面向国…

重磅上新!赛宁人员能力验证评估系统,高效解决人才培养和能力认证难

网络安全人员是安全防护的核心与关键&#xff0c;其素质与能力对关键信息基础设施网络安全防护至关重要。在金融、能源、电子政务等关键行业的网络信息安全规范或指南中&#xff0c;均对网络安全从业人员的资质、能力、培训作出相应规定。《信息安全技术 关键信息基础设施安全保…

wblogic中间件配置数据源

配置数据源 1.服务-数据源-配置-新建 2.单机选一般数据源 3.选择源名称、jndi名称、数据库类型 4.选择驱动 5.下一步 6.输入连接串信息 参考&#xff1a; 格式二&#xff1a;jdbc:oracle:thin:<host>:<port>:<SID> 数据库名称配置的sid 7.测试配置&#xff…

java基础知识点系列——第一个程序(二)

java基础知识点系列——第一个程序&#xff08;二&#xff09; 1、常用的DOS命令 打开命令提示符窗口 按下winR输入cmd按下回车键 常用命令 2、path环境变量的配置 为什么配置path环境变量 开发java程序&#xff0c;需要使用JDK提供的开发工具&#xff0c;而这些开发工具…

Java程序设计——GUI设计

一、目的 通过用户图形界面设计&#xff0c;掌握JavaSwing开发的基本方法。 二、实验内容与设计思想 实验内容&#xff1a; 课本验证实验&#xff1a; Example10_6 图 1 Example10_7 图 2 图 3 Example10_15 图 4 设计思想&#xff1a; ①学生信息管理系统&#xff1a…

三种解密 HTTPS 流量的方法介绍

Web 安全是一项系统工程&#xff0c;任何细微疏忽都可能导致整个安全堡垒土崩瓦解。拿 HTTPS 来说&#xff0c;它的「内容加密、数据完整性、身份认证」三大安全保证&#xff0c;也会受到非法根证书、服务端配置错误、SSL 库漏洞、私钥被盗等等风险的影响。很多同学认为只要访问…

Unity之摄像机

一、摄像机类型 1.1 透视摄像机 透视摄像机有近大远小的效果&#xff0c;与我们在现实中看到的效果相同。所以当两个同样大小的物体到摄像机的距离不同时我们看到的大小也会不同。Unity的3D项目中默认使用的就是透视摄像机。 1.2 正交摄像机 正交摄像机没有近大远小的效果&am…

Python 微服务架构指南

概要 微服务架构作为一种设计风格&#xff0c;它将应用程序构建为一套小服务的集合&#xff0c;每个服务实现特定的业务功能&#xff0c;这些服务可以独立部署、扩展并围绕特定业务能力构建。Python 凭借其简洁易读的语法和强大的库生态系统成为实现微服务的受欢迎选择。本文将…