走向面向?qū)ο蟮牧笤瓌t--接口隔離原則

面向?qū)ο缶幊痰牧笤瓌t


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

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

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 {
        // 進(jìn)行判斷
        if (outputStream!=null){
            try {
                // 關(guān)閉輸出流
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

這段代碼的可讀性非常差,各種try...catch相互嵌套,如果一行代碼寫(xiě)在了錯(cuò)誤的方法體內(nèi),那就。。相信大家對(duì)于這樣的代碼也是非常反感的,那么,如何解決它呢?
在Java中有一個(gè)接口名為Closeable,該接口標(biāo)識(shí)了一個(gè)可以被關(guān)閉的對(duì)象,它只有一個(gè)close方法,代碼會(huì)在下面貼出,我們現(xiàn)在所使用的FileOutputStream就實(shí)現(xiàn)了接口,除此之外,還有一百多個(gè)類都實(shí)現(xiàn)了這個(gè)接口,這就意味著,你在使用這相關(guān)的一百多個(gè)類的時(shí)候,都必須要執(zhí)行close方法,不覺(jué)得這樣很難忍受嗎?反正我是忍不了。我們先看看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!");
                }
            }

具體的代碼實(shí)現(xiàn)不是我們所關(guān)心的問(wèn)題,我們所在意的是,如何去解決這個(gè)麻煩?在此處,我新建了一個(gè)工具類去完成統(tǒng)一關(guān)閉實(shí)現(xiàn)此接口的類的功能,代碼如下:

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

實(shí)際使用中是這樣的:

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 );
    }
}

這樣一來(lái)代碼是不是簡(jiǎn)潔了很多?并且定義的工具類可以運(yùn)用到各種需要進(jìn)行關(guān)閉的對(duì)象中,保證了代碼的重用性。此處的工具類中的方法close(Closeable closeable)不正體現(xiàn)了我們?cè)?strong>依賴倒置原則中所強(qiáng)調(diào)的,盡量以來(lái)抽象而不是具體實(shí)現(xiàn)。同時(shí)呢,該方法所需要知道的僅僅只是這個(gè)類是可以關(guān)閉的,其他的什么都不需要關(guān)心,這也就是我們本章所講述的接口隔離原則。


寫(xiě)在最后#

我們的Bob(Robert C Martin)大叔,將單一原則、開(kāi)閉原則、里氏替換原則、接口隔離原則、依賴倒置原則五個(gè)原則定義為SOLID原則,當(dāng)這五個(gè)原則貫徹在你的代碼中時(shí),可以使得項(xiàng)目更清晰、簡(jiǎn)單、同時(shí)擁有最大程度的拓展性。在開(kāi)發(fā)中如何使用,如何規(guī)范,那就是各位同仁需要思考的問(wèn)題了。
學(xué)而不思則罔,在明天結(jié)束的迪米特原則后,我們的走向面向?qū)ο蟮牧笤瓌t主題就要結(jié)束了。這段時(shí)間作者在寫(xiě)博客的時(shí)候也收獲很多,認(rèn)識(shí)了很多新朋友,交流了蠻多新奇的想法,同時(shí)也希望各位讀者在評(píng)論區(qū)暢所欲言,作者會(huì)一一答復(fù)的。
好的,今天就到這里,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單一職責(zé)原則 (SRP) 全稱 SRP , Single Responsibility Principle 單一職...
    米莉_L閱讀 1,876評(píng)論 2 5
  • 本文出自《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》中的第一章。 1、優(yōu)化代碼的第一步——單一職責(zé)原則 單一職責(zé)原則的...
    MrSimp1e0閱讀 1,919評(píng)論 1 13
  • 最新在閱讀《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》一書(shū),我覺(jué)得寫(xiě)的很清晰,每一個(gè)知識(shí)點(diǎn)都有示例,通過(guò)示例更加容易理...
    慕涵盛華閱讀 2,469評(píng)論 0 3
  • 設(shè)計(jì)模式六大原則 設(shè)計(jì)模式六大原則(1):?jiǎn)我宦氊?zé)原則 定義:不要存在多于一個(gè)導(dǎo)致類變更的原因。通俗的說(shuō),即一個(gè)類...
    viva158閱讀 828評(píng)論 0 1
  • 一、開(kāi)閉原則(Open Close Principle) 一個(gè)軟件實(shí)體如類、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。...
    囧書(shū)閱讀 1,360評(píng)論 0 1

友情鏈接更多精彩內(nèi)容