软件设计模式原则(五)接口隔离原则

顾名思义,该原则说的是:客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。 

一.定义

核心思想:

  • 使用多个专门的接口比使用单一的总接口要好。
  • 一个类对另外一个类的依赖性应当是建立在最小的接口上的。
  • 一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
  • 不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。

        单一接口原则:符合我们常说的高内聚低耦合的设计思想,从而使得类具有很好的可读性、可扩展性和可维护性。 

二.原理

遵循接口隔离原则有以下 5 个优点:

  1. 将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
  2. 接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。
  3. 如果接口的粒度大小定义合理,能够保证系统的稳定性;但是,如果定义过小,则会造成接口数量过多,使设计复杂化;如果定义太大,灵活性降低,无法提供定制服务,给整体项目带来无法预料的风险。
  4. 使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义。
  5. 能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码。

在具体应用接口隔离原则时,应该根据以下几个规则来衡量。

  • 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
  • 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
  • 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。
  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

三.引例

例1:电子商务的系统,有订单这个类,有三个地方会使用到

  • 一个是用户,只能有查询方法
  • 一个是外部系统,有添加订单的方法
  • 一个是管理后台,添加删除修改查询都要用到

根据接口隔离原则(ISP),一个类对另外一个类的依赖性应当是建立在最小的接口上:也就是说,对于用户,它只能依赖有一个查询方法的接口~(本质上还是在强调,职责的划分应尽可能地细致~)

例2:学生成绩管理程序

        学生成绩管理程序一般包含插入成绩、删除成绩、修改成绩、计算总分、计算均分、打印成绩信息、査询成绩信息等功能,如果将这些功能全部放到一个接口中显然不太合理,正确的做法是将它们分别放在输入模块、统计模块和打印模块等 3 个模块中~

例3:球员职责

现有接口forward,包含了如下的方法:

  • Outflank():包抄        
  • Heading():头球
  • FishLeap():鱼跃
  • volley():抽射
  • LongShot():世界波
  • Breakthrough():带球突破
  • BottomCross():下底传中
  • FollowShot():二点球补射
  • Penalty():点球
  • Corner():角球
  • Free():定位球
public interface forward {void Outflank();   void Heading();    void FishLeap();void volley();void LongShot();void Breakthrough();void BottomCross();void FollowShot();void Penalty();void Corner();void Free();
}

如果只有一个player类实现forward接口,该类就要实现接口的全部方法。接口方法太多了,player承担了太多职责,颗粒度过大,player类不得不空实现其他方法,违背了接口隔离原则。

public class Player implements forward {public void Outflank(){//禁区之狐}   public void Heading(){//大力头槌} public void FishLeap(){//鱼跃冲顶}public void volley(){//凌空抽射}public void LongShot(){//不会(空实现)}public void Breakthrough(){//不会(空实现)}public void BottomCross(){//不会(空实现)}public void FollowShot(){//不会(空实现)}public void Penalty(){//主罚点球}public void Corner(){//不会(空实现)}public void Free(){//不会(空实现)}}

如果将forward(前锋)接口划分为:

  • CentralForward:中锋
  • Winger:边锋
  • TheFalse9:伪九
  • ShadowStriker:影锋

        分别承担原接口中不同的方法,重构之后每个接口都承担自己的职责,灵活性很高,使用起来很方便,每个接口中都只包含和自己业务相关的方法,不会存在和自己无关的方法,达到了高内聚、松耦合的效果。

        在使用接口隔离原则时我们要控制接口的颗粒度,颗粒度不能太大,也不能太小。如果太小就会造成接口泛滥,不利于维护;接口入如果太大就会违背接口隔离原则,灵活性较差,使用起来不方便。一般来说接口中仅包含某业务模块的方法即可,不应该有其他业务模块的方法。 

        看到这,大家可能会不由自主的想到前面讲的:单一职责原则。这里大家一定要注意,单一职责原则,强调的是职责,站在业务逻辑的角度;而接口隔离原则,强调接口的方法尽量少。 

  • 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离
  • 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。

 

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

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

相关文章

博客文章SEO:提升博客排名和吸引更多读者的方法来啦!

互联网发展到现在,搜索引擎优化(SEO)一直发挥着不可替代的作用。搜索引擎的流量往往更加定向,来自搜索引擎的流量转化率更高,可以帮助企业更好地实现销售和推广目标。因此,通过合理的SEO策略,你…

市场调研:中国南美白对虾养殖面积达到17.75万公顷

南美白对虾(学名:Litopenaeus Vannamei )是对虾科、滨对虾属动物。成体最长达23厘米,甲壳较薄,正常体色为青蓝色或浅青灰色,全身不具斑纹。步足常呈白垩状,故有白肢虾之称。南美白对虾额角尖端的长度不超出第1触角柄的2节&#xf…

从浅入深掌握进阶结构体(C语言)

前言 这一期我们将继续讲解结构体的知识,还没有看过上一期的小伙伴一定要赶紧去学习哦。 上一期,冲鸭! 那么话不多说我们开始今天的学习吧! 文章目录 1,结构体的自引用2,匿名结构体3,位段4,结构体的传参5,尾声 1,结构体的自引用 …

基因组注释流程

一边学习,一边总结,一边分享! 详细教程请访问: 组学分析流程 本期分析流程 Hisat2-SamtoolsTrinity_GG_denovoPASA … 本期教程文章 题目:Genomic insights into local adaptation and future climate-induced vu…

FastAPI与BaseModel

from typing import Optionalfrom fastapi import FastAPI from pydantic import BaseModel #当一个模型属性具有默认值时,它不是必需的。否则它是一个必需属性。将默认值设为 None 可使其成为可选属性 app FastAPI() class Item(BaseModel):name:str #没有初始值都…

linux 安装 Apache 服务 并部署网站

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 写在前面 哈喽大家我是网络豆,本章将会…

数据结构—二叉树

文章目录 10.二叉树(1).二叉树的基本概念(2).遍历#1.前序遍历#2.中序遍历#3.后序遍历#4.非递归中序遍历 (3).中序前/后序建树#1.中序前序遍历建树#2.中序后序遍历建树 (4).递归和二叉树基本操作#1.求树高#2.求结点数#3.求叶子结点数#4.复制树#5.判断两棵树是否相等 (5).特殊二叉…

零信任组件和实施

零信任是一种安全标准,其功能遵循“从不信任,始终验证”的原则,并确保没有用户或设备受信任,无论他们是在组织网络内部还是外部。简而言之,零信任模型消除了信任组织安全边界内任何内容的概念,而是倡导严格…

操作系统复习总结——文件管理

🔥博客主页:真的睡不醒 🚀系列专栏:深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 💘每日语录:但愿每次回忆,对生活都不感到负疚。 🎉感谢大家点赞…

搜维尔科技:AI时代,迈向2030元宇宙数字人戏曲教育数字化思维、战略与未来!

一场关于中国传统戏曲与数字媒体交汇的探讨之旅将于今日在清华大学开讲,本次活动旨在推动AI时代大背景下,利用元宇宙、数字人等创新技术焕发中国传统戏曲全新活力。 讲座以“AI时代,迈向2030元宇宙数字人戏曲教育数字化思维、战略与未来”为主…

【Linux系统编程】开发工具yum和vim

目录 一,yum工具的使用 1,yum的介绍 2,yum的使用 二,vim工具的开发 1,vim的介绍 2,模式的使用 3,vim配置文件 4,sudo配置文件 一,yum工具的使用 1,y…

弱口令防护和网站防盗链有什么用

弱口令防护主要针对用户账户的安全。弱口令是指容易被猜测或破解的密码,如常见的密码、简单的数字序列或字典中的单词等。弱口令防护的目的是防止恶意用户或攻击者通过猜测或暴力破解密码的方式获取合法用户的账户权限。通过实施强密码策略、密码复杂度要求和账户锁…

【EI会议征稿中|航空航天领域】第二届航空航天与控制工程国际学术会议(ICoACE 2023)

第二届航空航天与控制工程国际学术会议(ICoACE 2023) 2023 2nd International Conference on Aerospace and Control Engineering 2023年第二届航空航天与控制工程国际学术会议(ICoACE 2023)将于2023年12月15-17日在江苏南京召开…

Selenium+Unittest+HTMLTestRunner框架更改为Selenium+Pytest+Allure(一)

背景:之前的框架,Selenium是3.x版本,现在更新到4.15版本后,一些写法如find_element_by_xxx 不再支持,改为find_element(By.xxx)的方式,同时由于Unittest不如Pytest在执行方面灵活(比如只执行冒烟…

数据库安全运维系统厂家在深圳的有哪些?咨询电话多少?

IT小伙伴都知道,数据库安全运维至关重要,因为随着信息技术的不断发展,数据库已经成为企业存储、管理和处理数据的关键平台,数据库承载着企业不少数据资产。因此使用数据库安全运维系统是必要的。那你知道数据库安全运维系统厂家在…

计算机网络:可靠数据传输(rdt)、流水协议、窗口滑动协议

文章目录 前言一、Rdt1.Rdt1.02.Rdt2.03.Rdt2.14.Rdt2.25.Rdt3.0 二、流水线协议1.滑动窗口(slide window)协议发送窗口接收窗口正常情况下的2个窗口互动异常情况下GBN的2个窗口互动异常情况下SR的2窗口互动GBN协议和SR协议的异同 2.小结 总结 前言 Rdt…

宝塔上安装mysql遇到的问题

宝塔上安装mysql遇到的问题 文章目录 宝塔上安装mysql遇到的问题一、下载mysql二、启动报错三、设置密码四、解决报错bash未找到命令mysql五、继续修改root密码五、宝塔中设置端口六、使用连接工具连接数据库 一、下载mysql 宝塔软件商店里下载mysql,然后点击启动。…

ELasticsearch:什么是语义搜索?

语义搜索定义 语义搜索是一种解释单词和短语含义的搜索引擎技术。 语义搜索的结果将返回与查询含义匹配的内容,而不是与查询中的单词字面匹配的内容。 语义搜索是一组搜索引擎功能,其中包括根据搜索者的意图及其搜索上下文理解单词。 此类搜索旨在通过…

python自动化操作:批量处理照片尺寸并输出到word文档中【第14篇—python-照片尺寸批量处理输出】

文章目录 一.背景二.需求三.实现源码3.1 项目结构3.2 源码3.3 核心调节照片大小 四.代码解释五.实现效果六.心得总结 一.背景 在当今数字化时代,照片处理和文档编辑是许多领域中不可或缺的任务。从个人创作到企业文档,人们经常需要快速而有效地处理大量…

Linux IO多路转接之epoll

文章目录 一、epoll初识 二、epoll的相关系统调用 1.epoll_create 2.epoll_ctl 3.epoll_wait 三、epoll工作原理 四、epoll的工作方式 本文主要介绍了epoll内部工作机制,如何达到高性能的多路转接。技术有限,如有错误请指正。参考文献:…