[GN] 设计模式——面向对象设计原则概述

文章目录

  • 面向对象设计原则概述
    • 单一职责原则
    • 开闭原则
    • 里氏代换原则
    • 依赖倒转原则
    • 接口隔离原则
    • 合成复用原则
    • 迪米特法则
  • 总结


提示:以下是本篇文章正文内容,下面案例可供参考

面向对象设计原则概述

在这里插入图片描述

单一职责原则

一个类只负责一个功能领域中的相应职责

类承担的职责越多,它被复用的可能性就越小
而且一个类承担的职责过多,就相当于将这些职责耦合在一起

开闭原则

一个软件实体应当对扩展开放,对修改关闭。即实体应尽量在不修改原有代码的情况下进行扩展。

里氏代换原则

所有引用基类(父类)的地方必须能透明地使用其子类的对象。
运用里氏代换原则时

  • 应该将父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法。
  • 程序运行时,子类实例替换父类实例,可以很方便地扩展系统的功能,无须修改原有子类的代码
  • 增加新的功能可以通过增加一个新的子类来实现。

依赖倒转原则

要针对接口编程,而不是针对实现编程。

在实现依赖倒转原则时

  • 需要针对抽象层编程
  • 具体类的对象通过依赖注入的方式 注入其他对象

其中接口注入是指通过实现在接口中声明的业务方法来传入具体类的对象。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。
例:
在这里插入图片描述

CustomerDAO 内调用TXT 和 Excel。需要手动更改代码

在这里插入图片描述

引入抽象层 只需要在CustomerDAO调用抽象类 并在配置文件xml定义调用TXT还是Excel

接口隔离原则

使用多个专门的接扣,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
即明确角色的业务 该接口方法仅服务该角色,不可多不必要的方法。

合成复用原则

尽量使用对象组合,而不是继承来达到复用的目的。

复用已有的设计

  • 首先应该考虑使用组合 / 聚合,组合 / 聚合可以使系统更加灵活,降低类与类之间的耦合度
  • 其次才考虑继承,在使用谜承时,需要严格遵循里氏代换原则,滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。

因为继承时候,基类会暴露在子类下。

在这里插入图片描述

如上 CustomerDAO 继承了 DBUtil.
现需要更换数据库连接方式为 Oracle数据库
这样需要修改CustomerDAO 或者 DBUtil 违反了开闭原则

在这里插入图片描述

如上CustomerDAO 与 DBUtil是关联关系
采用依赖注入方式将DBUtil注入CustomerDAO
Oracle采用继承扩展DBUtil类。 根据里氏替换原则 DBUtil子类对象可以覆盖DBUtil对象

迪米特法则

软件实体应当尽可能少地与其他实体发生相互作用。

总结

本篇知识设计模式开篇基础知识。后面将会补充我学习过程中的设计模式

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

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

相关文章

golang rang指针数据的坑

仅为记录学习golang过程中遇到的坑 func main() {type data struct {num int}datas : []data{{1},{2},{3},{4},{5},}for _,tmp : range datas{go func(d *data) {fmt.Println(d.num)}(&tmp)}time.Sleep(10 * time.Second) }预期输出: 1,2&#xff…

蓝桥杯---加法变乘法

我们都知道:123 ….. 491225,现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如:123 ... 10*1112 ... 27*2829 ... 492015 就是符合要求的答案. 请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是 提交10)…

2024年Java搭建面试题

2024年Java实战面试题(北京)_java 5 年 面试-CSDN博客 1、搭建docker容器 # 安装依赖的环境 yum -y install yum-utils device-mapper-persistent-data lvm2 # 设置镜像源为阿里 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/lin…

linux备份系统工具

安装 yum install rear -y 修改配置文件 vim /etc/rear/local.conf 添加如下内容 OUTPUTISOOUTPUT_URLnullBACKUPNETFSBACKUP_URLiso:///backupISO_DIR"/data/backup"NETFS_KEEP_OLD_BACKUP_COPYy 使用 rear -v mkbackup

C#学习笔记_关键字ref、out

函数传递参数 在C#中函数传递的参数,函数内有操作改变其值,并不会改变函数外参数对应变量的值,可见如下实例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading…

动手学深度学习(一)深度学习介绍1

目录 一、引言 1.日常生活中的机器学习: 2.机器学习中的关键组件: 2.1 数据: 2.2 模型: 2.3 目标函数: 2.4 优化算法: 3. 各种机器学习问题: 3.1 监督学习: 3.1.1 回归&…

08-Nacos-CP与AP模式

Zookeeper:保证CP,放弃可用性;一旦zookeeper集群中master节点宕了,则会重新选举leader,这个过程可能非常漫长,在这过程中服务不可用。Eureka:保证AP,放弃一致性;Eureka集…

MGRE实验报告二

实验要求: 实验预览图: 实验分析: 1、对R1-R5配置IP地址,同时R1-R5每个路由器各有一个环回 2.1、对R1、R3、R4路由器开启虚拟接口1,分别配置隧道IP、接口封装协议,接口类型、定义封装源、开启伪广播功能&…

cetos7.9 install kubeadmin

第 1 步:禁用 SELinux(可选但推荐) 如何在 CentOS 7 上查找 SELinux 状态 sestatus另一种选择是运行以下 cat 命令: vi /etc/selinux/config SELINUXdisabled rebootcentos7 linux 安装k8s前下面操作的作用是? cat…

JAVA双列集合Map的特点

一次存一对元素,分别是 键 和 值,他们是一 一对应的:其中:键不可以重复,值可以重复这一对数据叫键值对、键值对对象、或 Entry Map 的体系结构: Map的常见API: 方式的实现:注意 Map …

数据结构----链表介绍、模拟实现链表、链表的使用

文章目录 1. ArrayList存在的问题2. 链表定义2.1 链表的概念及结构2.2 链表的组合类型 3. 链表的实现3.1 单向、不带头、非循环链表的实现3.2 双向、不带头节点、非循环链表的实现 4.LinkedList的使用4.1 什么是LinkedList4.2 LinkedList的使用4.2.1. LinkedList的构造4.2.2. L…

第 6 章:Linux中使用时钟、计时器和信号

在本章中,我们将开始探索Linux环境中可用的各种计时器。随后,我们将深入了解时钟的重要性,并探讨UNIX时间的概念。接下来,我们将揭示在Linux中使用POSIX准确测量时间间隔的方法。之后,我们将进入std::chrono的领域&…

数据结构与算法-二叉树-二叉树的所有路径

二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5] 输出:["1->2->5","…

软考 系统分析师系列知识点之范围管理(3)

接前一篇文章:软考 系统分析师系列知识点之范围管理(2) 所属章节: 第20章. 项目管理 第2节. 范围管理 20.2.3 范围确认和控制 在对项目范围进行了定义、编制了详细的WBS之后,接下来的事情就是要让项目干系人确认范围…

计算机毕业设计 | vue+springboot 超市账单管理系统(附源码)

1,绪论 1.1 开发背景 世界上第一个购物中心诞生于美国纽约,外国人迈克尔库伦开设了第一家合作商店,为了更好地吸引大量客流量,迈克尔库伦精心设计了低价策略,通过大量进货把商品价格压低,通过商店一次性集…

HCIA---OSPF实验

题目: 一:IP规划及配置 IP规划没有要求,所以我们可以去任意规划,只要每个网段不要重复就好 规划的IP 配置IP 先在每个ABR设备上配置环回和接口IP,然后每台设备上使用display ip interface brief都查看一下 R1: R3&…

【LUA】转载github自用二改模版——调节音量、显示七日天气、历史剪贴板、系统信息显示

二改模版笔记 自动重新加载HS function reloadConfig(files)doReload falsefor _,file in pairs(files) doif file:sub(-4) ".lua" thendoReload trueendendif doReload thenhs.reload()end end myWatcher hs.pathwatcher.new(os.getenv("HOME") .. &…

测试ASP.NET Core项目调用EasyCaching的基本用法(InMemory)

EasyCaching属于开源缓存库,支持基本缓存方式及高级缓存用法,提高用户操作缓存的效率。EasyCaching支持的缓存方式包括以下类型,本文学习最基础的InMemory方式的基本用法。   EasyCaching.InMemory包属于基于内存的缓存库,使用的…

Jetson JetPack6.0 DP L4T 36.2

JetPack 6是有史以来最大的升级。 它不仅带来了更新的内核和更新的Ubuntu根文件系统,而且还包括以前从未在Jetson上提供的新功能。J etPack 6首次提供了运行任何Linux内核的灵活性,并提供了Jetson生态系统合作伙伴基于Linux的发行版的更广泛选择。 阅…

读取appsettings.json属性

1、定义对应读取类ReadConfig. 2、对应类中函数 private static IConfigurationRoot builder; static ConfigHelper() { builder new ConfigurationBuilder() .AddInMemoryCollection() .Set…