面向对象设计原则之5-接口隔离原则
接口隔离原则(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-接口隔离原则相关推荐
- 面象对象设计6大原则之四:接口隔离原则
转载自 面象对象设计6大原则之四:接口隔离原则 接口隔离原则(ISP),The Interface Segregation Principle 定义 客户端不需要强迫依赖那些它们不需要的接口. 类与接 ...
- C#软件设计——小话设计模式原则之:接口隔离原则ISP
前言:有朋友问我,设计模式原则这些东西在园子里都讨论烂了,一搜一大把的资料,还花这么大力气去整这个干嘛.博主不得不承认,园子里确实很多这方面的文章,并且不乏出色的博文.博主的想法是,既然要完善知识体系 ...
- 从零开始学习Java设计模式 | 软件设计原则篇:接口隔离原则
在本讲,我将为大家介绍软件设计原则里面的第四个原则,即接口隔离原则. 概述 接口隔离原则是指客户端不应该被迫依赖于它不使用的方法,一个类对另一个类的依赖应该建立在最小的接口上面. 这句话可能不是很好理 ...
- 设计模式原则之三:接口隔离原则
接口隔离原则要求的是在一个模块应该只依赖它需要的接口,以保证接口的小纯洁.而且需要保证接口应该尽量小,即设计接口的时候应该让接口尽量细化,不要定义太臃肿的接口(比如接口中有很多不相干的逻辑的方法声明) ...
- 8.接口隔离原则——面向对象设计原则
面向对象设计原则除了开闭原则.里氏替换原则.依赖倒置原则和单一职责原则以外,还有接口隔离原则.迪米特法则和合成复用原则.本节将详细介绍接口隔离原则. 接口隔离原则的定义 接口隔离原则(Interfac ...
- 接口隔离原则——面向对象设计原则
接口隔离原则的定义 接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法. 2 ...
- 软件设计原则之接口隔离原则、合成复用原则、迪米特原则
系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.接口隔离原则 什么是接口 ...
- 七大设计原则之接口隔离原则应用
目录 1 接口隔离原则介绍 2 接口隔离原则应用 1 接口隔离原则介绍 接口隔离原则(Interface Segregation Principle, ISP)是指用多个专门的接口,而不使用单一的总接 ...
- 面向对象的六大原则之 接口隔离原则——ISP
ISP = Interface Segregation Principle ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应当将 ...
- 设计模式 — 6大设计原则(依赖倒置和接口隔离原则)
设计模式 依赖倒置原则 示例 一 示例 二 依赖的三种写法 总结 接口隔离原则 实例 一 总结 依赖倒置原则 依赖倒置原则(Dependence Inversion Principle,DIP)这个名 ...
最新文章
- qt windows 静态编译_VS+QT工程配置问题
- mybatis相关知识
- 【Flutter】Dart 面向对象 ( 命名构造方法 | 工厂构造方法 | 命名工厂构造方法 )
- 云炬60s看世界20211119
- 为什么选择Dojo - 记Dojo中文博客正式开张
- redis cluster 分布式锁_关于分布式锁原理的一些学习与思考redis分布式锁,zookeeper分布式锁...
- RuntimeError: Working outside of request context. This typically means that you attempted to use fun
- vs2017中配置openGL环境
- fatal: remote origin already exists. (远程来源已经存在 解决办法)
- SolarWinds 软件出现3个新的严重漏洞
- 从零开始做Vue前端架构(2)
- 路由重分布 rip,eigrp,和ospf
- 第29课 - 排序课后练习
- AGV机器人RFID传感器CK-G06A与西门子1200PLC应用手册
- linux下增加宋体 仿宋 字体
- HTML页面跳转的几种方式(重定向)
- 细说SDRAM控制器
- 微信群二维码七天失效如何解决?有没有办法创建一个长期有效的微信群?
- 在我离开一段时间后锁定计算机,离开电脑一段时间怎么让win10自动锁屏
- switch语句练习题