接口隔离原则定义:类间的依赖关系应该建立在最小的接口上。
接口隔离原则将非常庞大、臃肿的接口拆分成更小的和更具体的接口,这样客户将会只需要知道他们感兴趣的方法。接口隔离原则的目的是系统解开耦合,从而容易重构、更改和重新部署。
下面以一个示例来说明:我们在使用 OutputStream 或者其他可关闭对象之后,必须保证它们最终被关闭,开放 — 封闭原则中 SD 卡缓存类有这样的代码
/**
* 将图片缓存到SD卡中
*/
public void put(String url, Bitmap bitmap) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(cacheDir + url);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if (fileOutputStream!=null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我们看到这段代码可读性非常差,各种 try...catch 嵌套都是些简单的代码,但是会严重影响,并且多层级的大括号很容易将代码写到错误的层级中。
我们知道 Java 中有一个 Closeable 接口,该接口标识了一个可关闭对象,它只有一个 close 方法,如下图所示。
屏幕快照 2019-09-02 17.22.59.pngFileOutputStream 类就实现了这个接口,从图中可以看到,还有100多个类实现了 Closeable 这个接口,在关闭这 100多个类型对象时,都需要写出像 put 方法中 finally 代码段那样的代码。既然都实现了 Closeable 类,只要建一个方法统一来关闭这些对象即可。
public final class CloseUtils {
private CloseUtils() {
}
/**
* 关闭 Closeable 对象
* @param closeable 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 bitmap) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(cacheDir + url);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
CloseUtils.closeQuietly(fileOutputStream);
}
}
代码简洁了很多,而且这个 closeQuietly 方法可以运用到各类可关闭的对象中,保证了代码的重用性。CloseUtils 的 closeQuietly 方法的基本原理就是依赖 Closeable 抽象而不是具体实现。
网友评论