面向对象的五大设计原则之接口隔离原则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luyaran/article/details/84614706

通过上篇文章,我们已经对于五大设计原则的单一职责原则有了一定的了解,接下来我们就来看下第二种设计原则,接口隔离原则,废话不多说啊,来仔细看。

我们在设计程序的时候,如果一个模块包含多个子模块,那么我们应该小心的对该模块做出抽象,假设该模块由一个类来实现,我们就可以把系统抽象成一个接口,但是要添加一个新的模块扩展程序的时候,并且这个新的模块扩展程序只包含部分子模块,那么系统会强迫我们在新的扩展程序中实现所有的方法,并且还要编写一些哑方法,这种接口,我们成为胖接口或者被污染的接口,我们使用这样的接口,会给系统引入一些不当的行为,可能会导致错误的结果或者说导致资源浪费。

要避免上述的问题呢,很简单,就是使用接口隔离原则(interface segregation principle,简称ISP),这个原则的意思就是,客户端不应该被强迫实现一些它们不会使用的接口,并且应该把胖接口中的方法分组,使用多个接口来替代它,每个接口服务于一个子模块。简单来说呢,就是使用多个专门的接口,比使用单个接口来处理所有的事物要好的多得多。

我们来看下接口隔离原则中的一些内容:

1、一个类对另外一个类的依赖性应该建立在最小的接口上

接口隔离原则可以做到不强迫客户(接口的使用方)依赖于它们不会使用的方法,接口的实现类应该只是呈现为单一职责的角色。接口隔离原则还可以客户之间的相互影响,也就是说,当某个客户要求提供新的职责(需求变化),迫使接口发生变化时,影响到其他用户的可能性会降低到最小。

2、客户端程序不应该依赖它不需要的接口方法(功能)

客户端程序只需要依赖它本身所需要的接口,别的都不需要依赖,也就是说,客户端需要什么,我们就提供什么,把不需要的剔除,这就要求切口进行细化,保证其本身的纯洁性。

你比如我们在应用继承的时候,由于子类将会继承父类中所有可用的方法,然而父类中的某些方法,子类可能并不需要,举个栗子啊,比如普通员工和经理都是继承雇员这个接口,员工需要每天写工作日志,但是经理不需要,一次我们不能用工作日志来卡经理,也就是说经理不应该依赖提交工作日志这个方法。

我们可以感觉出来哈,这个接口隔离原则和单一职责原则,在概念方面有一定程度上的交叉,实际上,很多设计模式在概念上都有交叉,甚至于我们很难分辨出某一段代码究竟是属于哪个设计模式。

不过,接口隔离原则,强调的是接口对于客户端的承诺越少越好,并且要做到专一,当某个客户程序的要求出现变化,而迫使接口发生变化时,影响其他客户程序的可能性越小越好,实际上就是接口污染的问题。

过于臃肿的接口设计就是对接口的污染,所谓的接口污染就是指为接口添加了不必要的职责,如果开发人员在接口中新增一个功能的目的只是减少接口实现类的数目,那么这个接口设计就会导致接口不断地被污染并且发胖。

这个接口污染会给系统带来维护困难和重用性差等方面的问题,为了能够重用被污染的接口,接口的实现类就被迫要实现和维护不需要的功能方法。

而接口隔离原则就是定制化服务设计的原则,我们使用接口的多重继承来实现对不同接口的组合,从而对外提供组合功能,最终达到按照需求提供服务的目的。

来看张图片:

按着上图来分析的话,客户A需要A服务,但是只要针对客户A的方法发生变化,客户B、C就会受到影响,所以呢,我们这种设计就需要对接口进行隔离。

再来看隔离后的图片:

 

再来按着上述图片进行分析, 如果针对客户A的方法发生变化,那么客户B、C就不会受到影响,到这里大家可能会有疑问,按着上述思想来进行接口的拆分的话,那我们需要做的接口岂不是很多,这个就需要我们有个标准了,也可以叫做高内聚,也就是说,接口要拆,但是不能拆得太细,最终的接口,应该具备一些基本的功能,能独立完成一项基本的任务。

上述两张图片也只是一个抽象的例子,我们在实际的应用中,还是会遇到一些问题的,比如,我们需要一个能适配多种类型数据库的DAO实现,那么我们首先应该是实现一个数据库操作的接口,在其中规定一些数据库操作的基本方法,像连接数据库,增删改查操作方法,关闭数据库连接等,这是一个最少功能的接口,对于一些MySQL中特有的而其他数据库不具有的或者性质不同的方法,如PHP中可能用的MySQL的pconnect方法,其他数据库里并不存在和这个方法相同的概念,这个方法就不应该出现在基本的接口里,那么基本的方法应该有哪些呢?答案就在PDO中。

PDO是一个抽象的数据接口层,它告诉我们一个基本的数据库操作接口应该实现哪些基本的方法,接口是一个高层次的抽象,所以接口里的方法应该是通用的、基本的、不易变化的,还有就是那些特有的方法我们可以根据接口隔离原则,我们可以设计另外一个接口,让这个含有特殊方法的类,同时实现这两个接口就好了。

对于接口污染我们可以有如下两种处理方案:

  1. 利用委托分离接口
  2. 利用多继承分离接口

在委托模式中,有两个对象参与处理同一个请求,接受请求的对象会将请求委托给里一个对象来处理,像策略模式、代理模式等都应用到了委托的概念。

好啦,本次记录就到这里了。

如果感觉不错的话,请多多点赞支持哦。。。 

猜你喜欢

转载自blog.csdn.net/luyaran/article/details/84614706
今日推荐