SHOW ME THE CODE - 面向对象程序设计之 - 接口隔离原则(ISP)

SHOW ME THE CODE - 面向对象设计系列

  • 1 SHOW ME THE CODE - 面向对象基本概念
  • 2 SHOW ME THE CODE - 面向对象程序设计之 - 单一职责原则(SRP)
  • 3 SHOW ME THE CODE - 面向对象程序设计之 - 开闭原则(OCP)
  • 4 SHOW ME THE CODE - 面向对象程序设计之 - 里氏替换原则(LSP)
  • 5 SHOW ME THE CODE - 面向对象程序设计之 - 接口隔离原则(ISP)

你的新手机有预装软件吗?

手机已经是生活必须品

再开始今天的主题之前我们先来看一个我们现实生活中大家都曾经遇到过的场景。当今社会手机已经成为了人们日常生活的必备品,除了很小的小朋友可能没有手机,其余的人基本上都拥有属于自已的手机。

新手机开箱,能装多少是多少

很多人都购买过新手机,有些人换机的频率还很高。当我们购买了一部新手机,按下电源键开机,并进行了基本的初始化设置后,首次进入手机的桌面,我想问一问大家的感受是什么?大家是否发现除了手机系统自带的系统必备的一些系统软件之外,很多的应用已经安装到了你的手机里,这些应用我们称之为预装应用。
比如说抖音、淘宝、支付宝、大众点评、头条、携程、QQ、微信、腾讯视频、优酷视频、拼多多、百度地图、哔哩哔哩等等,根据不同的手机厂商,预装的软件会有所不同。而且当我们打开手机应用商店,稍不留神就会下装安装一大堆“推荐安装”的应用。

我不需要的,请不要给我

当我买了一个新手机,第一件事情就是把一些用不上的APP卸载了,比如说:抖音,头条,携程,优酷视频,以及一些系统自带的很多用不上的其它应用。

之所以这么做,就是新手机预装了我不想要,且不需要,且让人反感的应用。为了手机,我被迫安装了不需要的东西,为了解决这个问题,我需要花额外的时间来卸载这些应用。

而今天我们要谈的“接口隔离原则(ISP)”,和手机的例子有相似之处,那就是我不需要的,请不要给我,否则我会很难受。

接口隔离原则

接口隔离原则的定义

接口隔离原则(Interface Segregation Principle,ISP)是面向对象设计中的一个原则,由罗伯特·C·马丁(Robert C. Martin),江湖人称:Uncle Bob, 鲍勃大叔,在他的著作《敏捷软件开发:原则、模式与实践》(Agile Software Development: Principles, Patterns, and Practices)中提出。
该原则的定义是:客户端不应该依赖于它不需要的接口

怎么理解“接口”

我们可以把接口比作剧本中的角色,而该角色在剧中由哪个演员来扮演则想当于接口的由哪个具体的类来实现。所以,一个接口应该简单的代表一个角色,而不是多个角色。

怎么理解接口隔离

接口隔离原则主要是为了防止设计出大而全的单一接口,这种接口通常包含了不同客户端所需的所有方法。

当我们进行设计接口时,应该将其设计得尽可能精简,只包含客户端需要的方法,而不应该强迫客户端去依赖于它们不需要的方法。接口隔离原则强调了接口的单一性和独立性,以减少类之间的耦合度,提高系统的灵活性、可维护性和可扩展性。

SHOW ME THE CODE

A Bad Example: All in One Interface

我们定义了一个用户管理的接口:UserManagement,里面包含用户创建更新操作,用户组操作,找回密码操作,我们的接口实现类:UserManagementService就是一个包含了所有操作的大类。

public interface UserManagement
{
	//创建用户,更新用户
	void createUser(User user);
	void updateUser(User user);
	
	//用户组操作
	List<User> getUserByGroup(String group);
	void addToGroup(User user, String group);
	void removeFromGroup(User user, String group);
	
	//找回密码
	String sendVerificationCode(User user, String phoneNumber);
	void verifyCode(String code);
	void resetPassword(User user, String newPassword);
}

public class UserManagementService implements UserManagement
{
	//创建用户,更新用户
	@Override
	public void createUser(User user)
	{
		//user creation logic
	}
	
	@Override
	public void updateUser(User user)
	{
		//update logic
	}
	
	//用户组操作
	@Override
	public List<User> getUserByGroup(String group)
	{
		//query users by group name, return a list of user by a specific group
	}
	
	@Override
	public void addToGroup(User user, String group)
	{
		//add a user to a group
	}

	@Override
	public void removeFromGroup(User user, String group)
	{
		//remove a user from a group
	}
	
	
	//找回密码
	@Override
	public String sendVerificationCode(User user, String phoneNumber)
	{
		//update logic
	}
	
	@Override
	public void verifyCode(String code)
	{
		//update logic
	}
	
	@Override
	public void resetPassword(User user, String newPassword)
	{
		//update logic
	}
}

如何重构,—>接口拆分

需要对上面的UserManagement接口和其实现类进行如下拆分

拆分后接口
IUserMng
IUserGroup
IPswChange
拆分后实现类
UserService
UserGroupService
PswChangeService
public interface IUserMng
{
	//创建用户,更新用户
	void createUser(User user);
	void updateUser(User user);
}	

public interface IUserGroup
{
	//用户组操作
	List<User> getUserByGroup(String group);
	void addToGroup(User user, String group);
	void removeFromGroup(User user, String group);
}

public interface IPswChange
{	
	//找回密码
	String sendVerificationCode(User user, String phoneNumber);
	void verifyCode(String code);
	void resetPassword(User user, String newPassword);
}

public class UserService implements IUserMng
{
	//创建用户,更新用户
	@Override
	public void createUser(User user)
	{
		//user creation logic
	}
	
	@Override
	public void updateUser(User user)
	{
		//update logic
	}
}

public class UserGroupService implements IUserGroup
{	
	//用户组操作
	@Override
	public List<User> getUserByGroup(String group)
	{
		//query users by group name, return a list of user by a specific group
	}
	
	@Override
	public void addToGroup(User user, String group)
	{
		//add a user to a group
	}

	@Override
	public void removeFromGroup(User user, String group)
	{
		//remove a user from a group
	}
}

public class PswChangeService implements IPswChange
{	
	//找回密码
	@Override
	public String sendVerificationCode(User user, String phoneNumber)
	{
		//update logic
	}
	
	@Override
	public void verifyCode(String code)
	{
		//update logic
	}
	
	@Override
	public void resetPassword(User user, String newPassword)
	{
		//update logic
	}
}

接口隔离原则与其他设计原则的关系

在面向对象的几大设计原则中,每一个原则又与其它的原则有着密切的关系,他们共同的目标都是围绕软件的可扩展,可维护,灵活性以及降低代码的耦合度。

接口隔离原则与其他一些设计原则密切相关,例如:

**单一职责原则(SRP):**接口应该只包含那些与其功能密切相关的的方法,这与单一职责原则相符。
**依赖倒置原则(DIP):**接口应该被抽象类或接口所依赖,而不是具体类,这与依赖倒置原则相符。
**开闭原则(OCP):**接口应该对扩展开放,对修改封闭,这与开闭原则相符。

接口隔离与单一职责的比较

  • 适用范围不同:
    • 单一职责原则(SRP)主要关注的是类或模块的设计,它要求一个类或模块应该只有一个引起它变化的原因,即一个类或模块应该只有一个责任。
    • 接口隔离原则(ISP)更多地关注接口的设计,它要求接口的设计应该精简单一,客户端不应该依赖于它们不需要的接口。
  • 关注点不同:
    • SRP关注的是类或模块内部的责任分配,即一个类或模块应该负责完成一个特定的任务。
    • 而ISP关注的是类或模块与外部的交互,即接口的设计应该满足客户端的需求,不应该强迫客户端依赖于它们不需要的方法。
  • 侧重点不同:
    • SRP侧重于避免一个类或模块内部功能的混乱和耦合,通过将不同的职责分离到不同的类或模块中来提高内聚性和降低耦合性。
    • 而ISP侧重于避免类或模块与外部的依赖关系过于紧密,通过精简接口的设计来减少客户端与接口的耦合度。

希望这篇文章可以帮助大家理解什么是接口隔离原则,欢迎大家一起交流。

关注我的公众号

欢迎大家关注、点赞、转发,一起交流软件开发、架构设计、云原生技术。
TXZQ聊IT技术与架构

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

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

相关文章

C语言实验-学生信息管理系统

按以下菜单界面编写学生信息管理系统&#xff1b; 1&#xff09;录入学生信息首先输入学生人数&#xff0c;然后根据学生人数开辟动态数组&#xff1b; 2&#xff09;学生信息包括学号、姓名、性别、三门课成绩、总分&#xff1b;其中学号、姓名、 性别、三门课成绩是需要从键盘…

用git上传本地文件到github

两种方式&#xff1a;都需要git软件&#xff08;1&#xff09;VScode上传 &#xff08;2&#xff09;直接命令行&#xff0c;后者不需要VScode软件 &#xff08;1&#xff09;vscode 上传非常方便&#xff0c;前提是下载好了vscode和git软件 1 在项目空白处右击&#xff0c;弹…

ReentrantReadWriteLock类

为了有了ReentrantLock还需要ReentrantReadWriteLock ReentrantReadWriteLock是一个读写锁&#xff0c;它允许多个读操作同时进行&#xff0c;但在写操作时会阻止其他所有读和写操作。这种锁特别适合于读取远多于写入的场景&#xff0c;因为它可以提高并发性而不会牺牲数据一致…

华为OD机试 - 小扇和小船的数字游戏 - 二进制(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

VsCode | 修改首页启动页 Logo

VsCode | 修改首页启动页 Logo 最终效果&#xff1a; 插件的安装 先安装插件 Custom CSS and JS Loader 插件配置 Ctrl Shift P 输入 打开用户设置&#xff0c;在末尾添加 "vscode_custom_css.imports": [""]下载 Logo 下载 Logo 点我下载 引入…

SDB2F3 1.5A,高达28V输出1.2MHz升压转换器芯片IC

一般说明 该SDB2F3是一个恒定的频率&#xff0c;5针SOT23用于小型低功率应用的电流模式升压转换器。 该SDB2F3开关在1.2MHz&#xff0c;并允许使用微小&#xff0c;低成本的电容器和电感2毫米或更少的高度。内部软启动的结果在小浪涌电流和延长电池寿命。 该SDB2F3工作从…

string底层浅析

char简单易用,但是string是万金油 char *b "123"; string a{"123"};a是不是地址 发现a是地址 a的地址是不是和a[0]地址重合 #include<iostream> #include<cstring> using namespace std; int main() {string a{ "123" };char g[…

Pytorch分布式train——pytorch.distributed.launch V.S. torchrun

1. 较早的pytorch.distributed.launch python -m torch.distributed.launch --nproc_per_node4 --nnodes1 --node_rank0 train.py --args XXX 参数解析&#xff1a; nnodes&#xff1a;节点&#xff08;主机&#xff09;的数量&#xff0c;通常一个节点对应一个主机 node_rank…

探索动态内存开辟的奥秘

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 前言 开始之前&#xff0c;我们先来了解一下C/C中程序内存区域划分。 在C/C程序中&#xff0c;内存区域通常被划分为以下几个部分&#xff1a; 1.栈&…

漏洞挖掘之某厂商OAuth2.0认证缺陷

0x00 前言 文章中的项目地址统一修改为: a.test.com 保护厂商也保护自己 0x01 OAuth2.0 经常出现的地方 1&#xff1a;网站登录处 2&#xff1a;社交帐号绑定处 0x02 某厂商绑定微博请求包 0x02.1 请求包1&#xff1a; Request: GET https://www.a.test.com/users/auth/weibo?…

C++设计模式-创建型设计模式

设计模式 设计模式是什么 设计模式是指在软件开发中&#xff0c;经过验证的&#xff0c;用于解决在特定环境下&#xff0c;重复出现的&#xff0c;特定问题的解决方案&#xff1b;其实就是解决问题的固定套路。但是要慎用设计模式&#xff0c;有一定的工程代码量之后用它比较…

Hdfs小文件治理策略以及治理经验

小文件是 Hadoop 集群运维中的常见挑战&#xff0c;尤其对于大规模运行的集群来说可谓至关重要。如果处理不好&#xff0c;可能会导致许多并发症。Hadoop集群本质是为了TB,PB规模的数据存储和计算因运而生的。为啥大数据开发都说小文件的治理重要&#xff0c;说HDFS 存储小文件…

Python字符串常用方法(全网最细,仅此一份)

🥇作者简介:CSDN内容合伙人、新星计划第三季Python赛道Top1 🔥本文已收录于Python系列专栏: 👉Python从入门到精通 💬订阅专栏后可私信博主进入Python学习交流群,进群可领取Python180G全栈视频教程以及Python相关电子书合集 😊私信未回可以加V:hacker0327 备注P…

Word文件后缀

Word文件后缀 .docx文件为Microsoft Word文档后缀名&#xff0c;基于XML文件格式 .dotm为Word启用了宏的模板 .dotx为Word模板 .doc为Word97-2003文档&#xff0c;二进制文件格式 参考链接 Word、Excel 和 PowerPoint 的文件格式参考 Learn Microsoft

u盘格式化后电脑读不出来怎么办?u盘格式化的东西还能恢复吗

随着科技的快速发展&#xff0c;U盘已成为我们日常生活和工作中不可或缺的数据存储工具。然而&#xff0c;有时我们可能会遇到U盘格式化后电脑无法读取的情况&#xff0c;或是误格式化导致重要数据丢失。面对这些问题&#xff0c;我们该如何应对&#xff1f;本文将为您详细解答…

C语言 main( ) 函数的指针数组形参是怎么回事?

一、问题 在使⽤⼀些开发⼯具⽣成C语⾔⽂件时&#xff0c;主函数 mian( ) 中会有参数&#xff0c;这个参数到底是怎么回事⼉呢&#xff1f; 二、解答 mian( ) 称为主函数&#xff0c;是所有程序运⾏的⼊口。 mian( ) 函数是由系统调⽤的&#xff0c;当处于操作命令状态下&…

解锁学术语言:掌握论文释义工具的高效使用技巧

研究论文是一份书面文件&#xff0c;其中包括对特定主题的论点、想法和观点的概述。释义至关重要&#xff0c;因为它可以为您的工作增添意义和价值。教育释义的核心目的是增加你的写作的价值&#xff0c;同时考虑其他作家的观点和发现&#xff0c;并建立与你的主题的相关性。通…

恶补《操作系统》5_1——王道学习笔记

5设备管理 5.1_1 I-O设备的概念和分类 1、什么是I-O设备 输入/输出&#xff1a;I/O设备就是可以将数据输入到计算机&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件。 2、按使用特性分类 人机交互的外部设备存储设备网络通信设备 3、…

k8s Dashboard 运维维护记录

k8s Dashboard 运维维护记录 k8s Dashboard 运维维护记录 Q1&#xff1a;需要使用firefox浏览器访问 提示了证书错误NET::ERR_CERT_INVALID&#xff0c;原因是由于物理机的浏览器证书不可用 需要注意的是&#xff0c;若提示“连接不安全”的警告时&#xff0c;点击“高级”…

计算机的翻译(编译和链接)过程

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C语言基本概念 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f697;1.翻译环境和运行环境&#xff1…