走向面向對象的六大原則--接口隔離原則

面向對象編程的六大原則


讓項目擁有變化的能力--接口隔離原則
接口隔離原則的英文全稱是:InterfaceSegregation Principles,縮寫是ISP
定義是:客戶端不應該依賴它不需要的接口。

這里我們同樣回到之前的代碼,在之前的DiskCache中,我們有將圖片的outputStream關閉的操作,如下:

public void put(String url,Bitmap bitmap){
    FileOutputStream outputStream = null;
    try {
        outputStream = new FileOutputStream(url);
        bitmap.compress(Bitmap.CompressFormat.PNG,100,outputStream);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }finally {
        // 進行判斷
        if (outputStream!=null){
            try {
                // 關閉輸出流
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

這段代碼的可讀性非常差,各種try...catch相互嵌套,如果一行代碼寫在了錯誤的方法體內,那就。。相信大家對于這樣的代碼也是非常反感的,那么,如何解決它呢?
在Java中有一個接口名為Closeable,該接口標識了一個可以被關閉的對象,它只有一個close方法,代碼會在下面貼出,我們現在所使用的FileOutputStream就實現了接口,除此之外,還有一百多個類都實現了這個接口,這就意味著,你在使用這相關的一百多個類的時候,都必須要執行close方法,不覺得這樣很難忍受嗎?反正我是忍不了。我們先看看FileOutputStream和Closeable的代碼:

// Closeable 
public interface Closeable extends AutoCloseable {    
    void close() throws IOException;
}

// OutputStream 
public abstract class OutputStream implements Closeable, Flushable {
                public OutputStream() {
                    throw new RuntimeException("Stub!");
                }

                public abstract void write(int var1) throws IOException;

                public void write(byte[] b) throws IOException {
                    throw new RuntimeException("Stub!");
                }

                public void write(byte[] b, int off, int len) throws IOException {
                    throw new RuntimeException("Stub!");
                }

                public void flush() throws IOException {
                    throw new RuntimeException("Stub!");
                }

                public void close() throws IOException {
                    throw new RuntimeException("Stub!");
                }
            }

具體的代碼實現不是我們所關心的問題,我們所在意的是,如何去解決這個麻煩?在此處,我新建了一個工具類去完成統一關閉實現此接口的類的功能,代碼如下:

public class CloseUtils {
    
    public static void close(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

實際使用中是這樣的:

public void put(String url, Bitmap bitmap) {
    FileOutputStream outputStream = null;
    try {
        outputStream = new FileOutputStream(url);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        CloseUtils.colse(outputStream );
    }
}

這樣一來代碼是不是簡潔了很多?并且定義的工具類可以運用到各種需要進行關閉的對象中,保證了代碼的重用性。此處的工具類中的方法close(Closeable closeable)不正體現了我們在依賴倒置原則中所強調的,盡量以來抽象而不是具體實現。同時呢,該方法所需要知道的僅僅只是這個類是可以關閉的,其他的什么都不需要關心,這也就是我們本章所講述的接口隔離原則


寫在最后#

我們的Bob(Robert C Martin)大叔,將單一原則、開閉原則、里氏替換原則、接口隔離原則、依賴倒置原則五個原則定義為SOLID原則,當這五個原則貫徹在你的代碼中時,可以使得項目更清晰、簡單、同時擁有最大程度的拓展性。在開發中如何使用,如何規范,那就是各位同仁需要思考的問題了。
學而不思則罔,在明天結束的迪米特原則后,我們的走向面向對象的六大原則主題就要結束了。這段時間作者在寫博客的時候也收獲很多,認識了很多新朋友,交流了蠻多新奇的想法,同時也希望各位讀者在評論區暢所欲言,作者會一一答復的。
好的,今天就到這里,謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 單一職責原則 (SRP) 全稱 SRP , Single Responsibility Principle 單一職...
    米莉_L閱讀 1,796評論 2 5
  • 本文出自《Android源碼設計模式解析與實戰》中的第一章。 1、優化代碼的第一步——單一職責原則 單一職責原則的...
    MrSimp1e0閱讀 1,814評論 1 13
  • 最新在閱讀《Android源碼設計模式解析與實戰》一書,我覺得寫的很清晰,每一個知識點都有示例,通過示例更加容易理...
    慕涵盛華閱讀 1,971評論 0 3
  • 設計模式六大原則 設計模式六大原則(1):單一職責原則 定義:不要存在多于一個導致類變更的原因。通俗的說,即一個類...
    viva158閱讀 783評論 0 1
  • 一、開閉原則(Open Close Principle) 一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。...
    囧書閱讀 1,238評論 0 1