接口隔离原则

来源:互联网 发布:卖家被淘宝封号前预兆 编辑:程序博客网 时间:2024/05/17 00:00

转载请注明出处!!!http://blog.csdn.net/zhonghuan1992

         所有配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern



跟着ZHONGHuan学习设计模

接口隔离原则







对接口的理解

         这里的接口,不是java语言内部的interface的意思,在这里,可以将接口理解为一个类提供的所有的方法的特征集合,通俗点说就是所有可见方法和可见变量(java的说法, c++的说法是可见函数和可见属性元素)。

接口隔离原则的定义:

一个类对于另一个类的依赖应当建立在最小的接口上,不应当依赖一些不需要的接口。

 

         从实例中来体会定义。假设我们有两个学生类,文科生和理科生,他们需要考试,我们把考试抽象出一个接口,让不同的实现类来实现。如下图一所示:

        

图一

     从上面的设计中,我们用代码实现

/** * 考试抽象类 *  * @author zhonghuan */interface Exam{public void chinese();// 考语文public void math();// 考数学public void physics();// 考物理public void geolography();// 考地理}/** * 文科生实现考试抽象类,文科生不考物理 *  * @author zhonghuan */class ExamForLiberalArtStu implements Exam{public void chinese(){System.out.println("考语文");}public void math(){System.out.println("考数学");}public void physics(){// "不考物理", 不用实现, 没有意义}public void geolography(){System.out.println("考地理");}}/** * 理科生实现考试抽象类,理科生不考地理 *  * @author zhonghuan */class ExamForScienceStu implements Exam{public void chinese(){System.out.println("考语文");}public void math(){System.out.println("考数学");}public void physics(){System.out.println("考物理");}public void geolography(){// 理科生不考地理,不用实现没有意义}}

         可以看到,设计上,用一个接口来作为父类,可是子类却要实现自己不会没有必要实现的方法,这样的设计显然是不合适的。如果接口过于臃肿,如上面的例子,虽然看上去,你只是多实现了一个方法,但是如果是其它的情况,方法比较多的情况下,是不合适的,那样的接口的过于臃肿会更加明显。

         所以,在设计的时候,应当对接口在整个生命周期中扮演的角色搞清楚,针对上面的实例,考试接口分为两个角色,一个是文科生考试的角色,一个是理科生考试的角色,所以可以将这个接口分为三个接口。

        

图二

         从图二的设计中,将原来的一个接口分为三个接口,一般考试接口,理科考试接口,文科考试接口,文科生和理科生都可以依赖最小的接口,而不用担心接口臃肿的问题。

     

/** * 考试抽象类 *  * @author zhonghuan */interface Exam{public void chinese();// 考语文public void math();// 考数学}/** * 理科生考试接口 */interface ScienceExam{public void physics();// 考物理}/** * 文科生考试接口 */interface LiberalArtExam{public void geolography();// 考地理}/** * 文科生考试实现类 *  * @author zhonghuan */class ExamForLiberalArtStu implements Exam, LiberalArtExam{public void chinese(){System.out.println("考语文");}public void math(){System.out.println("考数学");}public void geolography(){System.out.println("考地理");}}/** * 理科生考试实现类 *  * @author zhonghuan */class ExamForScienceStu implements Exam, ScienceExam{public void chinese(){System.out.println("考语文");}public void math(){System.out.println("考数学");}public void physics(){System.out.println("考物理");}}

 

        接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。在上面的例子中,原本依赖于一个大的抽象接口,改为依赖于3个更细化的抽象接口,可以避免接口的污染.

使用接口隔离原则的注意事项

         1接口尽量小,尽量遵循接口隔离原则,不要意图构建一个万能接口。

         2设计接口时,应根据实际情况分析,尽可能设计小的接口,为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

         3提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

在以后的应用中慢慢去掌握这个原则,在后面的设计模式中,我们还会重温这个原则。

21 0
原创粉丝点击