理念:
使用多个专门的接口,而不使用单一的总接口 ,即客户端不应该依赖那些它不需要的接口;
每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干;
在使用接口隔离原则时,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便;
案例:
小明在工作中接到一个需求,需要将交易数据读取出来,形成报表展示,还需要形成报告上传,于是他是这样设计的代码:
首先定义了一个交易数据处理接口TransactionDataInterface
,如下:
/**
* 交易数据处理接口
*/
public interface TransactionDataInterface {
/**
* 读取数据
*
* @return 交易数据
*/
Object readData();
/**
* 形成报表
*
* @return 报表
*/
Object createChart();
/**
* 展示报表
*/
void displayChart();
/**
* 形成报告
*
* @return 报告
*/
Object createReport();
/**
* 上传报告
*/
void uploadReport();
}
当需要对交易数据形成报表并展示时,他创建了一个交易数据报表类TransactionDataChart
,并实现了交易数据处理接口TransactionDataInterface
,如下:
/**
* 交易数据报表
*/
public class TransactionDataChart implements TransactionDataInterface {
@Override
public Object readData() {
Object data = new Object();
return data;
}
@Override
public Object createChart() {
// 这里省略形成报表操作
Object chart = new Object();
return chart;
}
@Override
public void displayChart() {
System.out.println("展示报表");
}
@Override
public Object createReport() {
return null;
}
@Override
public void uploadReport() {
}
}
从上面的案例来看,因为交易数据处理接口TransactionDataInterface中没有把交易数据报表与报告的行为隔离,导致在交易数据报表类TransactionDataChart中不得不对报告的行为进行空实现,如果这样的空实现在系统代码中大量出现,那直接影响了代码的质量;这就是违背了接口隔离原则
;
同样是上面的案例,当懂得接口隔离原则的小红遇到时,会怎样来设计呢?接下来请看:
首先定义一个交易数据阅读器接口TransactionDataReader
去读取数据,如下:
/**
* 交易数据阅读器
*/
public interface TransactionDataReader {
/**
* 读取数据
*
* @return 交易数据
*/
Object readData();
}
然后定义交易数据报表处理器接口TransactionDataChartHandler
和交易数据报告处理器接口TransactionDataReportHandler
,并同时继承交易数据阅读器TransactionDataReader
接口,如下:
/**
* 交易数据报表处理器
*/
public interface TransactionDataChartHandler extends TransactionDataReader {
Object createChart();
void displayChart();
}
/**
* 交易数据报告处理器
*/
public interface TransactionDataReportHandler extends TransactionDataReader {
Object createReport();
void uploadReport();
}
这时候当需要对交易数据形成报表并展示时,小红重新定义了TransactionDataChart
类,只对TransactionDataChartHandler
接口进行实现,如下:
/**
* 交易数据报表
*/
public class TransactionDataChart implements TransactionDataChartHandler {
@Override
public Object readData() {
Object data = new Object();
return data;
}
@Override
public Object createChart() {
// 这里省略形成报表操作
Object chart = new Object();
return chart;
}
@Override
public void displayChart() {
System.out.println("展示报表");
}
}
从上面小红的代码来看,TransactionDataChart
类中已然没有了报告相关的接口实现,是因为在上层接口已对其进行了隔离,这就是遵循了接口隔离原则;
相关链接: