接口隔离原则:客户端不应该依赖它不需要的接口。另一种定义:类间的依赖关系应该建立在最
小的接口上。接口隔离原则就是把庞大的、臃肿的接口拆分成尽可能小的和具体的接口,这样客
户只需要实现他需要实现的接口就可以了,那些不必要实现的接口就被隔离开了,即不在我们所
依赖接口的实现(implement)类中,代码就会变得简洁。说白了就是对一个复杂、臃肿的接口
进行拆分,使得每个接口的功能具体、简单。
我们还是举个简单的例子说明:
1.我们创建一个接口,用于描述各种交通工具的接口Vehicle
public interface Vehicle {
void car();
void bus();
void truck();
}
2.现在我们去实现这个接口
2.1我要描述我的小车
public class MyCar implements Vehicle{
private static final String TAG = "MyTest";
@Override
public void car() {
Log.i(TAG,"This is my car.");
}
@Override
public void bus() {
//这个方法不是必须的
}
@Override
public void truck() {
//这个方法不是必须的
}
}
我们会发现在MyCar这个类中,我们并没有用到bus()和truck()这两个方法。但由于它们是和car()在
同一个接口里,所以也必须在MyCar类中出现。
同理看下下面这两个方法一样
public class MyTruck implements Vehicle{
private static final String TAG = "MyTest";
@Override
public void car() {
//这个方法不是必须的
}
@Override
public void bus() {
//这个方法不是必须的
}
@Override
public void truck() {
Log.i(TAG,"This is my truck.");
}
}
public class MyBus implements Vehicle {
private static final String TAG = "MyTest";
@Override
public void car() {
//这个方法不是必须的
}
@Override
public void bus() {
Log.i(TAG, "This is my bus.");
}
@Override
public void truck() {
//这个方法不是必须的
}
}
那我们该怎么去简化这种麻烦呢,让代码简洁清晰明了,没有多余的部分。很简单,接口隔离告
诉了我们只要把接口简化了就可以了。我们把接口Vehicle拆分成三个,如下所示:
public interface Vehicle {
void car();
void bus();
void truck();
}
public interface Car {
void cars();
}
public interface Bus {
void buss();
}
public interface Truck {
void Trucks();
}
现在我们需要实现Car这个接口,代码如下,是不是简洁了很多,砍掉了多余的部分。
public class CartA implements Car {
private static final String TAG = "MyTest";
@Override
public void cars() {
Log.i(TAG,"这是汽车A,价值2000万。");
}
}
public class CartB implements Car {
private static final String TAG = "MyTest";
@Override
public void cars() {
Log.i(TAG, "这是汽车B,价值100万。");
}
}
总结:
1.接口尽量小,尽量具体。但是接口过小,也会使得接口过多,从而变得复杂,具体需要怎么样的
接口需要对具体问题具体分析。这个需要一定的编程经验。
2.考虑要依赖接口的类所需要的方法,不要多余的,多余的就变得臃肿,也不要太小,否则接口就
会变得躲起来,失去了使接口变小的意义,只有专注地为某个模块提供定制接口服务,才可能建立
最小的依赖关系。