接口隔离原则

2019-04-29  本文已影响0人  wuchao226

接口隔离原则定义:类间的依赖关系应该建立在最小的接口上。

接口隔离原则将非常庞大、臃肿的接口拆分成更小的和更具体的接口,这样客户将会只需要知道他们感兴趣的方法。接口隔离原则的目的是系统解开耦合,从而容易重构、更改和重新部署。

下面以一个示例来说明:我们在使用 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.png

FileOutputStream 类就实现了这个接口,从图中可以看到,还有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 抽象而不是具体实现。

上一篇下一篇

猜你喜欢

热点阅读