1、接口隔离原则
好吧,老规矩,我们先看看英文定义是怎样的,如下:
Clients should not be forced to depend upon interfaces that they don't use.
这句话翻译过来是:客户端不应该强行依赖它不需要的接口。这里的接口不仅仅是指interface所定义的关键字,也可以指抽象类,抽象类具备接口的某一些功能特征。
2、另一种定义
关于接口隔离原则的定义,如果说上面的定义还稍显得有些模糊,那么这里有另外一种定义,描述如下:
The dependency of one class to another one should depend on the smallest possible interface.
翻译过来,意思是:类间的依赖关系应该建立在最小的接口上。
如何理解这句话呢?这句话意思是说:接口隔离原则要求一个模块应该只依赖它需要的接口,以保证接口的纯洁性(只依赖一个)。而且需要保证接口应该尽量小(方法少),不要定义太臃肿的接口。初略看起来,这个定义好像与单一原则有些类似,的确,两者都强调单一性,所不同的是,单一原则强调的是职责,表示的是业务逻辑,而接口隔离,要求的是方法尽可能少,接口尽可能的小,方法尽可能有用(没用就不要放这里)。
3、举例说明
对于帅哥,不同的人可能有不同的定义。年轻的少女怀春,可能觉得高大、长相好是帅哥,等到毕业走上社会,可能觉得,有钱、有背景才是帅哥,其它的不管。有些就更加,要三者具备,高、富、帅三者都要才是帅哥。那么,这个时候,我们如果是一家婚姻中介,如何给这个女孩子找她所要求的帅哥呢?
这时,我们需要定义一个帅哥接口,如果没有按照接口隔离原则,我们可能直接定义,高富帅为接口类型,如下:
/**
* 帅哥这个接口
* @author ljtyzhr
*
*/
public interface Handsome {
/**
* 有钱(富)
*/
public void haveMoney();
/**
* 有身高(高)
*/
public void haveHeight();
/**
* 有脸(帅)
*/
public void haveFace();
}
/**
* 帅
* @author ljtyzhr
*
*/
public interface FaceMan {
/**
* 有脸(帅)
*/
public void haveFace();
}
/**
* 高
* @author ljtyzhr
*
*/
public interface HeightMan {
/**
* 有身高(高)
*/
public void haveHeight();
}
4、隔离的意义
从上面的示例可以看到,当我们将接口细化之后,就可以通过接口之间不同的组合,来满足不同女孩子对于帅哥的要求。比如,她想找一个又高又帅的,可以实现上面的两个接口,如果找三个都具备的,可以实现三者的接口。实际上真正的接口隔离,应该按照这样的方式去细化,这样可以降低程序的耦合性,增加内聚。
给一个案例,如下:
/**
* 这是又高又帅的人
*
* @author ljtyzhr
*
*/
public class HansomeMan implements FaceMan, HeightMan {
@Override
public void haveHeight() {
// TODO Auto-generated method stub
System.out.println("高高的帅哥");
}
@Override
public void haveFace() {
// TODO Auto-generated method stub
System.out.println("帅帅的帅哥");
}
}