SOLID-接口隔离原则(ISP)
上一篇文章我们学习了SOLID中的里氏替换原则(L),如果还不了解里氏替换原则的小伙伴可以先去看了我的这篇文章再回来噢想做软件开发得先搞懂软件的设计原则—SOLID原则之里氏替换
今天我们学习的是SOLID中的I,也就是接口隔离原则;接口隔离原则的思想是将复杂接口的各个部分分离为单独的接口,以避免迫使客户机实现它们实际上并不需要的功能。每当您为一些复杂的应用程序编写插件时,您遇到一个接口,该接口有20个令人困惑的方法,要用各种各样的无操作和返回空值来实现时,API的作者很可能违反了ISP。
(图片来自网络侵删)下面我们就举个例子来说明一下:
假设你要定义一台多功能机器,它有打印,扫描和传真功能:
public interface IMachine{void Print(Document d);void Fax(Document d);void Scan(Document d);}
这是一个问题,因为这个接口的一些实现者可能不需要扫描或传真,只需要打印。然而你却强迫他们去实现那些额外的特性。当然,它们都可以是无操作的,但为什么要为此烦恼呢?
ISP建议将接口分开,这样实现者就可以根据他们的需要进行选择。由于打印和扫描是不同的操作(例如,扫描仪不能打印),我们为它们定义了单独的接口:
public interface IPrinter{void Print(Document d);}public interface IScanner{void Scan(Document d);}public interface IFax{ void Fax(Document d);}
然后打印机可以只实现打印功能,没有其他东西:
public class Printer : IPrinter{ public void Print(Document d) { // 实现代码 }}
类似地,如果我们想实现复印机,我们可以通过实现IPrinter和IScanner接口来实现:
public class Photocopier : IPrinter, IScanner{ public void Print(Document d) { ... } public void Scan(Document d) { ... }}
所以简单地说就是我们要细分接口,尽量避免出现没有意义或者让人迷惑的东西;
好啦,今天的学习就到这里,接口隔离原则大家都懂了吗?下次我们学习SOLID中的最后一个原则,依赖倒置原则(DIP),记得关注噢。