设计模式 - 六大设计原则之ISP(接口隔离原则)

news2024/11/26 3:32:28

文章目录

  • 概述
  • Case
  • Bad Impl
  • Better Impl

在这里插入图片描述


概述

接口隔离原则(Interface Segregation Principle, ISP),要求尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含相关的方法。

接口隔离是为了高内聚、低耦合。 在实际的开发中,通常都是先定义好需要开发的接口,并由各个服务去实现。 但是如果没有经过考虑和设计,很可能造成一个接口中包含了众多的接口方法,而这些接口并不一定在每一个类中都需要实现, 这样的接口很难维护, 也不易于扩展,每一次修改验证都有潜在的风险。

在具体应用接口隔离原则时, 应该根据以下几个规则进行考量

  • 接口尽量小,但应该有限度。 一个接口只服务于一个子模块或者业务逻辑
  • 为依赖接口的类定制服务, 只提供调用者需要的方法,屏蔽不需要的方法。
  • 提高内聚,减少对外交互,让接口用最少的方法完成最多的事情
  • 接口拆分的标准需要深入了解业务逻辑。

Case

毒药里的英雄, 射手,战士、刺客等等,都有对应的技能


Bad Impl

首先定义一个技能接口,所有的英雄都需要实现这个接口

public interface ISkill {

    //灼日之矢
    void doArchery();

    // 隐袭
    void doInvisible();

    // 技能沉默
    void doSilent();

    // 眩晕
    void doVertigo();

}

【接口实现】

ublic class HeroHouYi implements ISkill{

    @Override
    public void doArchery() {
        System.out.println("后裔的灼日之矢");
    }

    @Override
    public void doInvisible() {
        System.out.println("后裔的隐身技能");
    }

    @Override
    public void doSilent() {
        System.out.println("后裔的沉默技能");
    }

    @Override
    public void doVertigo() {
        // 无此技能的实现
    }


}

后羿实现了三个技能, 最后一个眩晕技能无需实现(没有这功能)。


public class HeroLianPo implements ISkill{

    @Override
    public void doArchery() {
        // 无此技能的实现
    }

    @Override
    public void doInvisible() {
        System.out.println("廉颇的隐身技能");
    }

    @Override
    public void doSilent() {
        System.out.println("廉颇的沉默技能");
    }

    @Override
    public void doVertigo() {
        System.out.println("廉颇的眩晕技能");
    }

}

廉颇实现了三个技能, 射箭技能无需实现(没有这功能)。


【单元测试】

   @Test
    public void test_ISkill(){
        // 后裔
        HeroHouYi heroHouYi = new HeroHouYi();
        heroHouYi.doArchery();

        // 廉颇
        HeroLianPo heroLianPo = new HeroLianPo();
        heroLianPo.doInvisible();
    }

每个英雄里都有一个和自己无关的接口实现类,非常不符合设计模式,也不易于维护。 因为不仅无法控制外部的调用,还需要维护对应的文档来说明这个接口不需要实现。


Better Impl

接口隔离改善代码

按照接口隔离原则,应该在确保合理的情况下,把接口细分。 保证一个松散的结构,也就是把技能拆分出来,每个英雄都可以按需继承实现。

接下来分别定义4个技能接口

在这里插入图片描述

public interface ISkillArchery {

    //灼日之矢
    void doArchery();

}

public interface ISkillInvisible {

    // 隐袭
    void doInvisible();

}

public interface ISkillSilent {

    // 技能沉默
    void doSilent();

}


public interface ISkillVertigo {

    // 眩晕
    void doVertigo();

}


public class HeroHouYi implements ISkillArchery, ISkillInvisible, ISkillSilent {

    @Override
    public void doArchery() {
        System.out.println("后裔的灼日之矢");
    }

    @Override
    public void doInvisible() {
        System.out.println("后裔的隐身技能");
    }

    @Override
    public void doSilent() {
        System.out.println("后裔的沉默技能");
    }

}

public class HeroLianPo implements ISkillInvisible, ISkillSilent, ISkillVertigo {

    @Override
    public void doInvisible() {
        System.out.println("廉颇的隐身技能");
    }

    @Override
    public void doSilent() {
        System.out.println("廉颇的沉默技能");
    }

    @Override
    public void doVertigo() {
        System.out.println("廉颇的眩晕技能");
    }

}

【单元测试】

 @Test
    public void test(){
        // 后裔
        HeroHouYi heroHouYi = new HeroHouYi();
        heroHouYi.doArchery();
        // 廉颇
        HeroLianPo heroLianPo = new HeroLianPo();
        heroLianPo.doInvisible();
    }

这样的实现方式就可以避免一些本身不属于自己的技能还需要不断的使用文档的方式进行维护,同时提高了代码的可靠性,可以降低开发成本和维护风险。

在这里插入图片描述

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

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

相关文章

Altova MobileTogether 8.1

Altova MobileTogether 8.1 使用RecordsManager进行无代码开发的主要更新 可视化配置复杂条件的主要脚本扩展。 分层用户组。 客户端之间的UI兼容性模式 当开发人员希望应用程序在所有平台上看起来都一样,而不是使用每个平台的原生外观时,现在可以使用新…

蓝桥杯刷题016——最大子矩阵(尺取法+单调队列)

题目来源:最大子矩阵 - 蓝桥云课 (lanqiao.cn) 问题描述 小明有一个大小为 NM 的矩阵, 可以理解为一个 N 行 M 列的二维数组。 我们定义一个矩阵 m 的稳定度 f(m) 为f(m)max(m)−min(m), 其中 max(m) 表示矩阵 m 中的最大值, min(m) 表示矩阵 m 中的最小值。 现在小…

朴素贝叶斯分类

一、朴素贝叶斯法原理 1.基本原理 朴素贝叶斯法(Naive Bayes)是一种基础分类算法,它的核心是贝叶斯定理条件独立性假设。贝叶斯定理描述的是两个条件概率之间的关系,对两个事件A和B,由乘法法则易知(A∩B)P(A)P(B│A)P(B)P(A│B)(A∩B)P(A)P(…

离散数学与组合数学-06特殊的图

文章目录离散数学与组合数学-06特殊的图6.1 欧拉图6.1.1 哥尼斯堡七桥问题6.1.2 欧拉图的定义6.1.3 无向欧拉图的判定6.1.4 有向欧拉图的判定6.1.5 一笔画问题6.1.6 求回路6.2 哈密顿图6.2.1 周游世界问题6.2.2 哈密顿图的定义6.2.3 哈密顿图的必要条件6.2.4 哈密顿图的充分条件…

Hadoop基础之《(5)—MapReduce概述》

一、什么是MapReduce MapReduce将计算过程分为两个阶段:Map和Reduce。 1、Map阶段并行处理输入数据。 2、Reduce阶段对map结果进行汇总。 二、结构图 三、HDFS、Yarn、MapReduce三者之间的调用关系 HDFS三台服务器,第一台上有DataNode和NameNode。第二…

如何像程序员一样思考

如何像程序员一样思考 全世界越来越多的人发现了软件开发的乐趣和兴奋。一个你构建东西的职业,去打破它们,然后再把它们构建得更好。您可以经常设定自己的工作时间并与来自全球各地的客户一起工作的职业。一个可以自己当老板的职业?编程在 2…

android12.0(S) Launcher3 导入 AndroidStudio 调试编译

验证环境 aosp 12.0 源码,分支 android-12.0.0_r3 可以参考之前写的 android12.0(S) Pixel 3XL (QCOM 845) 编译刷机 AndroidStudio 版本 Android Studio Arctic Fox | 2020.3.1 Patch 4 gradle 版本 gradle-7.0.2-bin.zip gradle:7.0.4 二手 Pixel 3 XL一台可直…

[WUSTCTF2020]颜值成绩查询(布尔注入)

目录 信息收集 脚本 reference 信息收集 输入1出现固定的回显,输入2-4出现乱码 Hi admin, your score is: 100 输入其他特殊字符无回显,也无报错回显 采用布尔注入进行判断 布尔注入原理 代码存在SQL注入漏洞,然而页面即不会回显数据&am…

【C++算法图解专栏】一篇文章带你掌握尺取法(双指针)

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为 0 基础刚入门数据结构与算法的小伙伴提供详细的讲解,也欢迎大佬们一起交流~ 📚专栏地址:https://blog.csdn.net/Newin…

java spring IOC xml方式工厂Bean操作

spring中有两种Bean 第一种 普通 Bean 就是我们在配置文件中 定义的类对象 创建bean 并定义相关的id和声明类对象 普通bean的特点在于 在配置文件中定义的类型 也就是返回类型 就比如 你定义的是一个 book类的类型 那你这个bean返回的 也比如是个book类型的对象 第二种 是在工…

模拟实现vector/迭代器失效问题

对于STL,我们不仅学会使用STL,还要了解其底层原理,这样一来,我们就能知道什么时候用string好,什么时候用vector,什么时候用list,哪种方法效率高等等。其次了解了STL的底层原理,也助于我们的C功力…

RTF、RIR、Steering Vector傻傻分不清

RTF: Relative transfer function,相对传递函数RIR: Room impulse response,空间冲击响应Steering vector: 导向矢量场景问题定义:空间中存在I个麦克风和J个声源,麦克风采集到的信号其中,麦克i的信号其中表…

一起自学SLAM算法:9.1 ORB-SLAM2算法

连载文章,长期更新,欢迎关注: 下面将从原理分析、源码解读和安装与运行这3个方面展开讲解ORB-SLAM2算法。 9.1.1 ORB-SLAM2原理分析 前面已经说过,ORB-SLAM2算法是特征点法的典型代表。因此在下面的分析中,首先介绍一…

被删库勒索了,怎么使用docker进行MySQL容器的管理?

大家觉得写还可以,可以点赞、收藏、关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 起因:云服务器MySQL密码设置的太简单了,导致到被入…

路由策略实验

1.先配置IP和环回 [Huawei]sysname R1 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [R1-GigabitEthernet0/0/0]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip add 22.1.1.1 24 [R1-GigabitEthernet0/0/1]q [R1]int l 0 [R1-LoopBack0]ip ad…

ETHDenver 2023 的 Cartesi BUIDLathon 项目创意

希望你在了解Cartesi之前,谨慎对待自己的行为。一旦你开始研究并搜寻可以使用Cartesi Rollups构建的项目或者应用,你就会陷入一个令人兴奋的螺旋洞穴中,你会上瘾。如果你想在2023年中建造一些很具有意义的事情,那你就来对地方了。…

Python01概述 基础语法 判断

Python概述 第二章-Python基础语法 01-字面量 02-注释 03-变量 04-数据类型 05-数据类型转换 06-标识符 07-运算符 08-字符串的三种定义方式 09-字符串的拼接 10-字符串格式化 11-字符串格式化的精度控制 12-字符串格式化的方式-快速写法 13-对表达式进行格式化 14-字符串格…

Java语法核心——面向对象编程

目录 面向过程思想概述 面向对象思想概述 面向对象思想特点及举例 类与对象的关系 类的定义 类与对象的案例(demo02) 对象内存存储机制 成员变量和局部变量的区别 private关键字 面向过程思想概述 我们回想一下,这几天我们完成一个需求的步骤:首…

echarts数据可视化项目搭建(一)

目录直角坐标系通用配置项tooltiptoolboxlegenddataZoom柱状图常见效果折线图常见效果散点图常见效果其他坐标系饼图基本实现常见效果地图地图基本展示不同城市颜色不同地图与散点图结合雷达图仪表盘本博客内容参考黑马课程,详细信息请参考以下网址 Bilibili官方黑…

Apache Superset 开源商业智能大数据可视化

Apache Superset 是一款现代化的开源大数据工具,也是企业级商业智能 Web 应用,用于数据探索分析和数据可视化。 Apache Superset 是一个适合企业日常生产环境中使用的商业智能可视化工具。它具有快速、轻量、直观的特点,任何用户都可以轻松地…