面向对象六大原则(五):接口隔离原则

时间:2022-03-03 17:26:51
一、概述

接口隔离原则( Interface Segregation  Principle ,缩写:ISP),客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

二、原则

使用多个专门的接口比使用单一的总接口要好。

一个类对另外一个类的依赖性应当是建立在最小的接口上的。

一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。

“不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。”;再通俗点讲,不要强迫客户使用她们不用的方法,如果强迫用户使用她们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。

三、举例说明

下面引用《Android源码设计模式解析与实战》一书中示例:

1.在使用了OutputStream或者其他可关闭的对象后,我们必须保证它们最终被关闭了,因此SD卡缓存类中就有如下代码:

//将图片缓存到内存中
public void put(String url, Bitmap bmp){
FileOutputStream fileOutputStream = null;
try{
fileOutputStream = new FileOutputStream(cacheDir + url);
bmp.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
}catch (FileNotFoundException e){
e.printStackTrace();
}finally {
if(fileOutputStream != null){
try{
fileOutputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}//end if
}// end if finally
}

2.上述代码中可读性非常差,各种try...catch嵌套,我们知道Java中有个Closeable接口( 点击打开链接),该接口标识了一个可关闭的对象,它只有一个close方法,于是就有如下CloseUtils工具类的产生

public final class CloseUtils {
private CloseUtils(){}
/*
* 关闭Closeable对象
* @param closeable
* */
public static void closeQuietly(Closeable closeable){
if(null != closeable){
try {
closeable.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}

运用到put方法代码如下:

    //将图片缓存到内存中
public void put(String url, Bitmap bmp){
FileOutputStream fileOutputStream = null;
try{
fileOutputStream = new FileOutputStream(cacheDir + url);
bmp.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
}catch (FileNotFoundException e){
e.printStackTrace();
}finally {
CloseUtils.closeQuietly(fileOutputStream);
}
}

该closeQuietly方法可以运用到各类可关闭的对象中,保证了代码的重用性,该方法的基本原理就是依赖于Closeable抽象而不是具体实现(依赖倒置原则),并且建立在最小化依赖原则的基础上,它只需要知道这个函数是可关闭的,其他的一概不关心,也就是这里的接口隔离原则。

四、分析 

Robert C Martin在21世纪早期将  单一职责 、 开闭原则 、 里氏替换 、接口隔离以及 依赖倒置(依赖反转) 5个原则定义为SOLID原则,作为面向对象编程的5个基本原则。当这些原则被一起应用时,它们使得一个软件系统更清晰、简单,最大程度地拥抱变化。

SOLID原则最终可以简化为几个关键词:抽象、单一、职责、最小化。