面向對象編程的六大原則
讓項目擁有變化的能力--接口隔離原則
接口隔離原則的英文全稱是: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原則,當這五個原則貫徹在你的代碼中時,可以使得項目更清晰、簡單、同時擁有最大程度的拓展性。在開發中如何使用,如何規范,那就是各位同仁需要思考的問題了。
學而不思則罔,在明天結束的迪米特原則后,我們的走向面向對象的六大原則主題就要結束了。這段時間作者在寫博客的時候也收獲很多,認識了很多新朋友,交流了蠻多新奇的想法,同時也希望各位讀者在評論區暢所欲言,作者會一一答復的。
好的,今天就到這里,謝謝!