面向?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ù)的。
好的,今天就到這里,謝謝!