转载请注明出处!!!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提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
在以后的应用中慢慢去掌握这个原则,在后面的设计模式中,我们还会重温这个原则。