设计模式-设计原则-接口隔离原则

(转)面向对象设计原则之接口隔离原则

 接口隔离原则定义以下:html

接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不该该依赖那些它不须要的接口。编程

      根据接口隔离原则,当一个接口太大时,咱们须要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法便可。每个接口应该承担一种相对独立的角色,不干不应干的事,该干的事都要干。这里的“接口”每每有两种不一样的含义:一种是指一个类型所具备的方法特征的集合,仅仅是一种逻辑上的抽象;另一种是指某种语言具体的“接口”定义,有严格的定义和结构,好比Java语言中的interface。对于这两种不一样的含义,ISP的表达方式以及含义都有所不一样:编程语言

      (1) 当把“接口”理解成一个类型所提供的全部方法特征的集合的时候,这就是一种逻辑上的概念,接口的划分将直接带来类型的划分。能够把接口理解成角色,一个接口只能表明一个角色,每一个角色都有它特定的一个接口,此时,这个原则能够叫作角色隔离原则”。post

      (2) 若是把“接口”理解成狭义的特定语言的接口,那么ISP表达的意思是指接口仅仅提供客户端须要的行为,客户端不须要的行为则隐藏起来,应当为客户端提供尽量小的单独的接口,而不要提供大的总接口。在面向对象编程语言中,实现一个接口就须要实现该接口中定义的全部方法,所以大的总接口使用起来不必定很方便,为了使接口的职责单一,须要将大接口中的方法根据其职责不一样分别放在不一样的小接口中,以确保每一个接口使用起来都较为方便,并都承担某一单一角色。接口应该尽可能细化,同时接口中的方法应该尽可能少,每一个接口中只包含一个客户端(如子模块或业务逻辑类)所需的方法便可,这种机制也称为定制服务”,即为不一样的客户端提供宽窄不一样的接口。flex

      下面经过一个简单实例来加深对接口隔离原则的理解:spa

      Sunny软件公司开发人员针对某CRM系统的客户数据显示模块设计了如图1所示接口,其中方法dataRead()用于从文件中读取数据,方法transformToXML()用于将数据转换成XML格式,方法createChart()用于建立图表,方法displayChart()用于显示图表,方法createReport()用于建立文字报表,方法displayReport()用于显示文字报表。.net

1 初始设计方案结构图设计

      在实际使用过程当中发现该接口很不灵活,例如若是一个具体的数据显示类无须进行数据转换(源文件自己就是XML格式),但因为实现了该接口,将不得不实现其中声明的transformToXML()方法(至少须要提供一个空实现);若是须要建立和显示图表,除了需实现与图表相关的方法外,还须要实现建立和显示文字报表的方法,不然程序编译时将报错。orm

      现使用接口隔离原则对其进行重构。htm

      在图1中,因为在接口CustomerDataDisplay中定义了太多方法,即该接口承担了太多职责,一方面致使该接口的实现类很庞大,在不一样的实现类中都不得不实现接口中定义的全部方法,灵活性较差,若是出现大量的空方法,将致使系统中产生大量的无用代码,影响代码质量;另外一方面因为客户端针对大接口编程,将在必定程序上破坏程序的封装性,客户端看到了不该该看到的方法,没有为客户端定制接口。所以须要将该接口按照接口隔离原则和单一职责原则进行重构,将其中的一些方法封装在不一样的小接口中,确保每个接口使用起来都较为方便,并都承担某一单一角色,每一个接口中只包含一个客户端(如模块或类)所需的方法便可。

      经过使用接口隔离原则,本实例重构后的结构如图2所示:

2 重构后的结构图

      在使用接口隔离原则时,咱们须要注意控制接口的粒度,接口不能过小,若是过小会致使系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。通常而言,接口中仅包含为某一类用户定制的方法便可,不该该强迫客户依赖于那些它们不用的方法。

 【做者:刘伟  http://blog.csdn.net/lovelion

相关文章
相关标签/搜索