1.全称

  • Interface Segregation Principle
  • 缩写为:ISP

2.解释

  • 要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法

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

3.接口隔离原则的实现方法

1.场景

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

      插入成绩
      删除成绩
      修改成绩

    • 统计模块

      计算均分
      计算均分

    • 打印模块

      打印成绩信息
      査询成绩信息

2.实现

class Student:def __init__(self, name, subject, score):self._name = nameself._subject = subjectself._score = score@propertydef name(self):return self._name@name.setterdef name(self, value):self._name = value@propertydef subject(self):return self._subject@subject.setterdef subject(self, value):self._subject = value@propertydef score(self):return self._score@score.setterdef score(self, value):self._score = valueclass StudentScoreManager:student_list = []def insert_score(self, student: Student):raise NotImplementedErrordef delete_score(self, student: Student):raise NotImplementedErrordef update_score(self, student: Student):raise NotImplementedErrordef calculate_average_score(self, student: Student):raise NotImplementedErrordef calculate_total_score(self, student: Student):raise NotImplementedErrordef print_score(self, student: Student):raise NotImplementedErrordef query_score(self, student: Student):raise NotImplementedErrorclass InputManager(StudentScoreManager):def insert_score(self, student):self.student_list.append(student)def delete_score(self, student):self.student_list.remove(student)def update_score(self, student):for stu in self.student_list:if student.name == stu.name and student.subject == stu.subject:stu.score = student.scorebreakclass StatisticsManager(StudentScoreManager):def calculate_average_score(self, student):sum_score = 0count = 0for stu in self.student_list:if student.name == stu.name:count += 1sum_score += stu.scorereturn sum_score / countdef calculate_total_score(self, student):sum_score = 0for stu in self.student_list:if student.name == stu.name:sum_score += stu.scorereturn sum_scoreclass OutputManager(StudentScoreManager):def print_score(self, student):for stu in self.student_list:if student.name == stu.name:yield f"姓名:{stu.name}, 科目:{stu.subject}, 成绩:{stu.score}"def query_score(self, student):for stu in self.student_list:if student.score == stu.score:yield f"姓名:{stu.name}, 科目:{stu.subject}, 成绩:{stu.score}"if __name__ == '__main__':s1 = Student("张三", "数学", 87)s2 = Student("张三", "语文", 76)s3 = Student("李四", "英语", 87)s4 = Student("李四", "英语", 87)im = InputManager()im.insert_score(s1)im.insert_score(s2)im.insert_score(s3)im.insert_score(s4)# InputManager类没有输出学生的功能(报错)# im.print_score()print('----------------输出张三的成绩----------------')om = OutputManager()result = om.print_score(s1)for score_info in result:print(score_info)print('----------------修改张三的语文成绩----------------')s5 = Student("张三", "语文", 89)im.update_score(s5)result = om.print_score(s1)for score_info in result:print(score_info)print('----------------查询成绩为87的学生信息----------------')for resp in om.query_score(s1):print(resp)print('----------------输出张三的总成绩----------------')sm = StatisticsManager()print(sm.calculate_total_score(s1))print('----------------输出李四的平均成绩----------------')sm = StatisticsManager()print(sm.calculate_average_score(s3))
----------------输出张三的成绩----------------
姓名:张三, 科目:数学, 成绩:87
姓名:张三, 科目:语文, 成绩:76
----------------修改张三的语文成绩----------------
姓名:张三, 科目:数学, 成绩:87
姓名:张三, 科目:语文, 成绩:89
----------------查询成绩为87的学生信息----------------
姓名:张三, 科目:数学, 成绩:87
姓名:李四, 科目:英语, 成绩:87
姓名:李四, 科目:英语, 成绩:87
----------------输出张三的总成绩----------------
176
----------------输出李四的平均成绩----------------
87.0

4.接口隔离原则的优点

1.将臃肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。

2.接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。

3.如果接口的粒度大小定义合理,能够保证系统的稳定性;但是,如果定义过小,则会造成接口数量过多,使设计复杂化;如果定义太大,灵活性降低,无法提供定制服务,给整体项目带来无法预料的风险。

4.使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义。

5.能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码。

设计原则——接口隔离原则相关推荐

  1. 【设计模式】软件设计七大原则 ( 接口隔离原则 | 代码示例 )

    文章目录 一.接口隔离原则简介 二.接口隔离原则代码示例 ( 反面示例 ) 1.接口定义 ( 接口臃肿 ) 2.实现类 1 3.实现类 2 三.接口隔离原则代码示例 ( 推荐用法 ) 1.接口 1 2 ...

  2. 设计模式系列(二)七大设计原则-----接口隔离原则

    七大设计原则之单一接口隔离原则 接口隔离原则 案例 应用实例 改进 上一篇:设计模式系列(一)七大设计原则-----单一职责原则 下一篇:设计模式系列(三)七大设计原则-----依赖倒转原则 接口隔离 ...

  3. 六大设计原则-接口隔离原则

    1.开闭原则        2.接口隔离原则 3.依赖倒置原则 4.迪米特原则             5.里氏替换原则     6.单一职责原则 接口隔离原则 客户端不应该依赖它不需要的接口:一个类 ...

  4. 软件设计原则——接口隔离原则

    客户端不应该被迫依赖于它不使用的方法: 一个类对另一个类的依赖应该建立在最小的接口上. [例]安全门案例 我们需要创建一个黑马品牌的安全门,该安全门具有防火.防水.防盗的功能. 可以将防火,防水,防盗 ...

  5. java设计模式之设计原则④接口隔离原则

    定义: (1)用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口. (2)一个类对一个类的依赖应该建立在最小的接口上. (3)建立单一接口,不要建立庞大臃肿的接口. (4)尽量细化 ...

  6. 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

    设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...

  7. Java七大设计原则 - 接口隔离原则

    一.什么是 接口隔离原则 (Interface Segregation Principle) ? 原则含义: 一个类对于另外一个类的依赖应该建立在最小的接口上 1. 接口隔离原则" 实际上它 ...

  8. 设计模式原则 - 接口隔离原则(二)

    接口隔离原则 一 官方定义 二 案例演示 普通方案 案例分析 解决方案 解决方案 案例总结 三 与单一职责原则对比 一 官方定义 接口隔离原则(Interface Segregation Princi ...

  9. 面向对象六大原则——接口隔离原则

    什么是接口隔离原则(Interface Segregation Principle, ISP)  接口对于Java开发者来说都不陌生,它几乎存在于每一个Java程序中,是抽象的代名词.在讲接口隔离原则 ...

最新文章

  1. Paddington2
  2. YoloV5代码详细解读
  3. 静态Include和动态Include测试并总结
  4. php 自定义行间距,phpstorm 常见设置
  5. 联想一体机电源键不亮_联想电脑一体机B505拆机经验
  6. modbus与硬件对接Java_java中modbus协议连接
  7. redis 缓存过期默认时间_redis缓存过期机制
  8. 学习Duwamish7的MSDN说明及相关技术策略
  9. gentoo安装记录[20050216]
  10. Debian7桌面屏蔽图标和右键菜单的解决方法。
  11. Python基础——NaN(Not a Number)
  12. 深入剖析Redis主从复制
  13. Java学习手册:无符号左移无符号右移有符号右移
  14. yarn启动vue项目
  15. 关于软件测试未来发展趋势分析与总结
  16. 360一键root工具 v5.1.3 pc绿色版
  17. linux下gpt分区,Linux下的GPT分区
  18. 脚本小子_python数据类型代码
  19. 一、达梦数据库的安装
  20. layui中table表格内容过多自动换行

热门文章

  1. Mobile按键对照表
  2. Linux入门——与目录相关的一些命令(pwd、ls、cd)及tab和上下方向键的使用
  3. HTML5之FileReader的使用
  4. 「TShark学习」TShark抓包笔记
  5. IEEE754浮点数格式详解
  6. 白盒测试概述及其方法简介
  7. Dynamic Slicing for Deep Neural Networks
  8. Java分割字符串(spilt())
  9. access数据库的用户名和密码的问题
  10. Ubuntu使用时的小问题