接口隔离原则(Interface Segregation Principle or ISP)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/347 访问。

客户端不应该依赖它不需要的接口。

ISP:Clients should not be forced to depend upon interfaces that they don’t use.

一个类对另外一个类的依赖性应当是建立在最小的接口上的。

示例:

public abstract class InvoiceBase {string InvoiceCode { get; set; }string InvoiceNumber { get; set; }}
public interface IInvoice {bool CreateInvoice(InvoiceBase invoice);bool PrintInvoice(InvoiceBase invoice);bool SendInvoice(InvoiceBase invoice);}
public class Invoice : InvoiceBase, IInvoice {public bool CreateInvoice(Invoice invoice) {Console.WriteLine("Create Invoice!");return true;}public bool PrintInvoice(Invoice invoice) {Console.WriteLine("Print Invoice!");return true;}public bool SendInvoice(Invoice invoice) {Console.WriteLine("Send Invoice by Email!");return true;}}

首先用InvoiceBase建立发票基类,其中包含发票代码和发票号码2个公共属性。IInvoice接口包含生成发票、打印发票和发送发票3个“动作”。生成发票和打印发票属于IInvoice接口是比较合理的,然后发送发票的动作放在此接口中并不同样如此,因为有些发票我们并不想发送出去,此种设计导致的结果是实现类Invoice最终会变成臃肿,原因是IInvoice接口太“胖”了。这种设计带来的另外一个后果是不利于未来的扩展,例如我们想为发票增加一个发票作废的动作,我们不得不修改所有IInvoice的实现类,而这些修改却并不是必要的。因为某些实现类中我们只是想使用发票的发送动作而已,却不得不为发票作废增加一个实现代码,明显违背开闭原则。以下给出一个解决方案以供参考:

public interface IInvoiceAction {bool CreateInvoice(IInvoiceBase invoice);bool PrintInvoice(IInvoiceBase invoice);bool CancelInvoice(IInvoiceBase invoice);}
public interface IInvoiceNotify {bool SendInvoice(IInvoiceBase invoice);}

建立IInvoiceAction接口和IInvoiceNotify接口以分离发票本身的行为和发票发送动作。

public interface IInvoice : IInvoiceAction, IInvoiceNotify {}

建立联合接口IInvoice方便在某些情况下需要同时使用两者的功能。

//增值税发票
public class VatInvoice : InvoiceBase, IInvoiceAction {public string CheckCode { get; set; }public bool CreateInvoice(IInvoiceBase invoice) {Console.WriteLine("Create Invoice!");return true;}public bool PrintInvoice(IInvoiceBase invoice) {Console.WriteLine("Print Invoice!");return true;}public bool CancelInvoice(IInvoiceBase invoice) {Console.WriteLine("Cancel Invoice!");return true;}}
//电子发票
public class ElectronicInvoice : InvoiceBase, IInvoiceNotify {public string PdfFile { get; set; }public bool SendInvoice(IInvoiceBase invoice) {Console.WriteLine("Send Invoice by Email!");return true;}}

增值税发票类VatInvoice和电子发票类ElectronicInvoice,仅实现IInvoiceAction或IInvoiceNotify接口并增加校验码和Pdf文件属性。

此例我们假设电子发票不用实现IInvoiceAction接口,我们只想发送电子发票的PDF文件。

public class Invoice : InvoiceBase, IInvoice {public bool CreateInvoice(IInvoiceBase invoice) {Console.WriteLine("Create Invoice!");return true;}public bool PrintInvoice(IInvoiceBase invoice) {Console.WriteLine("Print Invoice!");return true;}public bool CancelInvoice(IInvoiceBase invoice) {Console.WriteLine("Cancel Invoice!");return true;}public bool SendInvoice(IInvoiceBase invoice) {Console.WriteLine("Send Invoice by Email!");return true;}}

联合接口IInvoice的实现类Invoice,方便某些情况下需要同时使用所有的功能。

通过以上的代码改造,我们将接口功能最小化,每一个接口只负责与其自身相关的功能,防止功能过多导致的“接口污染”问题,符合接口隔离原则,并且有利于未来的扩展,同时符合开闭原则。

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/347 访问。

面向对象设计原则之5-接口隔离原则相关推荐

  1. 面象对象设计6大原则之四:接口隔离原则

    转载自 面象对象设计6大原则之四:接口隔离原则 接口隔离原则(ISP),The Interface Segregation Principle 定义 客户端不需要强迫依赖那些它们不需要的接口. 类与接 ...

  2. C#软件设计——小话设计模式原则之:接口隔离原则ISP

    前言:有朋友问我,设计模式原则这些东西在园子里都讨论烂了,一搜一大把的资料,还花这么大力气去整这个干嘛.博主不得不承认,园子里确实很多这方面的文章,并且不乏出色的博文.博主的想法是,既然要完善知识体系 ...

  3. 从零开始学习Java设计模式 | 软件设计原则篇:接口隔离原则

    在本讲,我将为大家介绍软件设计原则里面的第四个原则,即接口隔离原则. 概述 接口隔离原则是指客户端不应该被迫依赖于它不使用的方法,一个类对另一个类的依赖应该建立在最小的接口上面. 这句话可能不是很好理 ...

  4. 设计模式原则之三:接口隔离原则

    接口隔离原则要求的是在一个模块应该只依赖它需要的接口,以保证接口的小纯洁.而且需要保证接口应该尽量小,即设计接口的时候应该让接口尽量细化,不要定义太臃肿的接口(比如接口中有很多不相干的逻辑的方法声明) ...

  5. 8.接口隔离原则——面向对象设计原则

    面向对象设计原则除了开闭原则.里氏替换原则.依赖倒置原则和单一职责原则以外,还有接口隔离原则.迪米特法则和合成复用原则.本节将详细介绍接口隔离原则. 接口隔离原则的定义 接口隔离原则(Interfac ...

  6. 接口隔离原则——面向对象设计原则

    接口隔离原则的定义 接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法. 2 ...

  7. 软件设计原则之接口隔离原则、合成复用原则、迪米特原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.接口隔离原则 什么是接口 ...

  8. 七大设计原则之接口隔离原则应用

    目录 1 接口隔离原则介绍 2 接口隔离原则应用 1 接口隔离原则介绍 接口隔离原则(Interface Segregation Principle, ISP)是指用多个专门的接口,而不使用单一的总接 ...

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

    ISP = Interface Segregation Principle ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应当将 ...

  10. 设计模式 — 6大设计原则(依赖倒置和接口隔离原则)

    设计模式 依赖倒置原则 示例 一 示例 二 依赖的三种写法 总结 接口隔离原则 实例 一 总结 依赖倒置原则 依赖倒置原则(Dependence Inversion Principle,DIP)这个名 ...

最新文章

  1. qt windows 静态编译_VS+QT工程配置问题
  2. mybatis相关知识
  3. 【Flutter】Dart 面向对象 ( 命名构造方法 | 工厂构造方法 | 命名工厂构造方法 )
  4. 云炬60s看世界20211119
  5. 为什么选择Dojo - 记Dojo中文博客正式开张
  6. redis cluster 分布式锁_关于分布式锁原理的一些学习与思考redis分布式锁,zookeeper分布式锁...
  7. RuntimeError: Working outside of request context. This typically means that you attempted to use fun
  8. vs2017中配置openGL环境
  9. fatal: remote origin already exists. (远程来源已经存在 解决办法)
  10. SolarWinds 软件出现3个新的严重漏洞
  11. 从零开始做Vue前端架构(2)
  12. 路由重分布 rip,eigrp,和ospf
  13. 第29课 - 排序课后练习
  14. AGV机器人RFID传感器CK-G06A与西门子1200PLC应用手册
  15. linux下增加宋体 仿宋 字体
  16. HTML页面跳转的几种方式(重定向)
  17. 细说SDRAM控制器
  18. 微信群二维码七天失效如何解决?有没有办法创建一个长期有效的微信群?
  19. 在我离开一段时间后锁定计算机,离开电脑一段时间怎么让win10自动锁屏
  20. switch语句练习题

热门文章

  1. Tomcat 报错 java.net.connectexception:拒绝连接 解决办法
  2. 华科05-03年计算机考研复试机试
  3. 集合的体系结构 0119
  4. java数组 0912
  5. css3的新增选择器 200303
  6. 前端开发 字体样式的演练0229
  7. django-阻止某一个IP访问某一个页面
  8. python-基本装饰器
  9. 防止事件导致的oncreate的多次调用
  10. PHP 设计模式 笔记与总结(3)SPL 标准库