【设计模式】软件设计原则——接口隔离迪米特
接口隔离原则引出




接口隔离原则
定义:用多个专门的接口,不使用单一的总接口,客户端不应该依赖它不需要的接口;
一个类对另一个类的依赖,应该建立在最小接口上;如果有一个大接口,里面有很多方法,如果使用一个类实现该接口,所有的类都要实现,导致代码冗余;建立功能单一接口,不要建立特别多功能的接口;接口设计不能过大过小,适度接口。
优点:高内聚,低耦合,类具有很好的可读性,可扩展性,可维护性;
降低耦合:平时设计接口时,只暴露客户端需要的方法,客户端不需要的方法,直接隐藏起来;
提高内聚:减少对外交互,使用接口中最少的方法,完成最多的事情;实际开发中,对以后有可能会发生变更的地方做一些预判,抽象出业务模型。
接口隔离原则案例
public interface Animal{void eat();void fly();void walk();void swim();
}
//实现一个鸟类,swim方法是空的,造成代码冗余public class Bird implements Animal{@Overridepublic void eat() {}@Overridepublic void fly() {}@Overridepublic void walk() {}@Overridepublic void swim() {}
}
正确做法如下:
public interface IEat {void eat();
}
public interface IWalk {void walk();
}
public interface ISwim {void swim();
}
public interface IFly{void fly();
}//鸟可以飞,走,吃;不能游泳
public class Dog implements IEat,IWalk,IFly{@Overridepublic void eat() {}@Overridepublic void fly() {}@Overridepublic void walk() {}
}
迪米特原则引出

迪米特原则
定义:一个对象应该对其它对象,保持最少的了解;
尽量降低类之间的耦合;对外部引入的类,越少越好;
优点:降低了类之间的耦合;
代码层面:不要对外公开太多的public方法和变量,多使用private/protected权限;
核心观念:类的解耦,解耦是有一定程度的,尽量做到弱耦合,耦合程度越低,类的复用率才能提高;由于减少了类之间不必要的依赖,从而达到了降低了耦合的目的;
只和朋友交流,不和陌生人说话
朋友:出现在成员变量,方法的输入,输出参数中的类,称为成员朋友类;出现在方法体内部的类,不属于朋友类;也就是说类A,我使用了类A中的方法,或成员,尽量避免导致本类import导入新的类;
迪米特原则案例
老师让班长记录考勤
//老师类
public class Teacher{public void checkAttendance(Monitor monitor) {List<Student> studentList= new ArrayList<>();for (int i = 0; i < 50; i++) {studentList.add(new Student());}monitor.checkAttendance(studentList);}
}
//班长类
public class Monitor{public void checkStudentAttendance(List<Student> studentList) {System.out.println("今天有" + studentList.size()+"学生到教室");}
}
public class Student{
//学生类
}public class Main {public static void main(String[] args) {Teacher teacher= new Teacher();Monitor monitor= new Monitor();teacher.checkAttendance(monitor);}
}
//遵循迪米特原则
//Teacher直接给Monitor下指令 , Monitor去查考勤//老师类
public class Teacher{public void checAttendance(Monitor monitor) {monitor.checkAttendance();}
}
//班长类
public class Monitor{public void checkStudentAttendance(List<Student> studentList) {List<Student> studentList= new ArrayList<>();for (int i = 0; i < 50; i++) {studentList.add(new Student());}System.out.println("今天有" + studentList.size()+"学生到教室");}
}
public class Student{
//学生类
}
public class Main {public static void main(String[] args) {Teacher teacher= new Teacher ();Monitor monitor = new Monitor();teacher.checAttendance(monitor );}
}相关文章:
【设计模式】软件设计原则——接口隔离迪米特
接口隔离原则引出 接口隔离原则 定义:用多个专门的接口,不使用单一的总接口,客户端不应该依赖它不需要的接口; 一个类对另一个类的依赖,应该建立在最小接口上;如果有一个大接口,里面有很多方法,如果使用一个类实现该接口,所有的类都要实现,导致代码冗余;…...
【C++】——list的介绍和模拟实现
P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:Yan. yan. …...
B树系列解析
我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》࿱…...
docker 部署 WEB IDE
简介 问题描述:GitCode 的 Web IDE 不满足个人使用需求 如何解决:在本机或云服务器部署 Web IDE 如何解决 拉取容器镜像 docker pull coder/code-server 运行 docker run -d --name vscode -p 8080:8080 -p 8443:8443 -e PASSWORD"123456&quo…...
【Android】数据存储
本章介绍Android五种主要存储方式的用法,包括共享参数SharedPreferences、数据库SQLite、SD卡文件、App的全局内存,另外介绍重要组件之一的应用Application的基本概念与常见用法,以及四大组件之一的内容提供器ContentProvider的基本概念与常见…...
个人网络安全的几个重点与防御
1 浏览器 firefox 这是第一选择 如果你真的不明白可以找找各个浏览器漏洞 mail 的危险的 来自与代理和漏洞 浏览器溢出漏洞 实时注意更新就可以 2 防火墙 大家都用windows 只需在 gpedit.msc 设置 但有什么未知漏洞就不得而知了 因为美国的计划问题 网络端口溢出漏洞 但…...
python爬虫 - 初识爬虫
🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、爬虫的关键概念 (一)HTTP请求与响应 ࿰…...
tomcat版本升级导致的umask问题
文章目录 1、问题背景2、问题分析3、深入研究4、umask4.1、umask的工作原理4.2、umask的计算方式4.3、示例4.4、如何设置umask4.5、注意事项 1、问题背景 我们的java服务是打成war包放在tomcat容器里运行的,有一天我像往常一样去查看服务的日志文件,却提…...
Golang | Leetcode Golang题解之第455题分发饼干
题目: 题解: func findContentChildren(g []int, s []int) (ans int) {sort.Ints(g)sort.Ints(s)m, n : len(g), len(s)for i, j : 0, 0; i < m && j < n; i {for j < n && g[i] > s[j] {j}if j < n {ansj}}return }...
vscode+stfp插件,实现远程自动同步文件代码
概述 远程同步代码,将本地代码实时保存到同一局域网内的另一台电脑(linux系统),这里的本地代码也可以是远程服务上的代码,即从一个远程ip同步到另一台远程ip服务器。 工具 vscode,SFTP插件 安装 vscod…...
python 实现djb2哈希算法
djb2哈希算法介绍 DJB2哈希算法是一种简单且快速的哈希算法,由Daniel J. Bernstein设计。这种算法的实现非常简单,适用于短键值的哈希表,也常被用于嵌入式设备和资源受限的系统。 基本原理 DJB2算法的原理是将输入的字符串视为一个字节数组…...
文件夹作为普通文件而非子模块管理
relaxed_ik_ros2 文件夹下存在 .gitmodules 文件和 .gitignore 文件。这说明该目录已经被 Git 识别为子模块。 要将这个文件夹作为普通文件而非子模块管理,你可以按以下步骤操作: 1. 删除子模块配置 首先删除 .gitmodules 文件中的子模块配置。你可以…...
7c结构体
文章目录 一、结构体的设计二、结构体变量的初始化2.1结构体在内存表示;**2.2**结构体类型声明和 结构体变量的定义和初始化只声明结构体类型声明类型的同时定义变量p1用已有结构体类型定义结构体变量p2*定义变量的同时赋初值。*匿名声明结构体类型 2.3 结构体嵌套及…...
浅聊前后端分离开发和前后端不分离开发模式
1.先聊聊Web开发的开发框架Spring MVC 首先要知道,Spring MVC是Web开发领域的一个知名框架,可以开发基于请求-响应模式的Web应用。而Web开发的本质是遵循HTTP(Hyper Text Transfer Protocol: 超文本传输协议)协议【发请求…...
RabbitMQ篇(死信交换机)
目录 一、简介 二、TTL过期时间 三、应用场景 一、简介 当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter) 消费者使用basic.reject或者basic.nack声明消费失败,并且消息的requeue参数设置为false消息是一个过…...
HBase 的 MemStore 详解
一、MemStore 概述 MemStore 是 HBase 的内存存储区域,它是一个负责缓存数据写入操作的组件。每当有写操作(如 Put 或 Delete)发生时,数据会首先被写入到 MemStore 中,而不是直接写入磁盘。MemStore 类似于数据库中的缓…...
【嵌入式软件-数据结构与算法】01-数据结构
摘录于老师的教学课程~~(*๓╰╯๓)~~内含链表、队列、栈、循环队列等详细介绍~~ 基础知识系列 有空再继续更~~~ 目录 【链表】 一、单链表 1、存储结构:带头结点的单链表 2、单链表结点类型的定义 3、创建单链表 1)头插法 2)尾插法 …...
Windows应用开发-解析AVI视频文件
本Windows应用解析AVI视频文件,以表格的方式显示AVI文件结构。并可以将结果保存到bmp图片。下面是,使用该应用解析一部AVI电影获得的图片。 应用开发信息 定义一个INFO结构,包含两个字符串对象,一个ULONGLONG变量,和…...
探索TCP协议的奥秘:Python中的网络通信
引言 在网络通信的世界里,TCP协议(传输控制协议)就如同一座桥梁,连接着数据的发送方和接收方。作为一名拥有20年实战经验的编码专家,我深知TCP协议在构建稳定、可靠的网络应用中的重要性。今天,我将带领大…...
每日学习一个数据结构-树
文章目录 树的相关概念一、树的定义二、树的基本术语三、树的分类四、特殊类型的树五、树的遍历六、树的应用场景 树的遍历一、前序遍历二、中序遍历三、后序遍历使用java代码实现遍历总结 树的相关概念 树是一种重要的非线性数据结构,在计算机科学中有着广泛的应用…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
