設計應用程式的時候,如果乙個模組包含多個子模組,那麼我們應該小心對該模組做出抽象。設想該模組由乙個類實現,我們可以把系統抽象成乙個介面。但是要新增乙個新的模組擴充套件程式時,如果要新增的模組只包含原系統中的一些子模組,那麼系統就會強迫我們實現介面中的所有方法,並且還要編寫一些啞方法。這樣的介面被稱為胖介面或者被汙染的介面,使用這樣的介面將會給系統引入一些不當的行為,這些不當的行為可能導致不正確的結果,也可能導致資源浪費。
介面隔離原則(inte***ce segregation principle,isp)表明客戶端不應該被強迫實現一些他們不會使用的介面,應該把胖介面中的方法分組,然後用多個介面代替它,每個介面服務於乙個子模組。簡單地說,就是使用多個專門的介面比使用單個介面要好得多。
isp的主要觀點如下:
1)乙個類對另外乙個類的依賴性應當是建立在最小的介面上的。
isp可以達到不強迫客戶(介面的使用方)依賴於他們不用的方法,介面的實現類應該只呈現為單一職責的角色(遵守srp原則)。
isp還可以降低客戶之間的相互影響——當某個客戶程式要求提供新的職責(需求變化)而迫使介面發生改變時,影響到其他客戶程式的可能性會最小。
2)客戶端程式不應該依賴它不需要的介面方法(功能)。
客戶端程式不應該依賴它不需要的介面方法(功能),那依賴什麼?依賴它所需要的介面。客戶端需要什麼介面就提供什麼介面,把不需要的介面剔除,這就要求對介面進行細化,保證其純潔性。
比如在應用繼承時,由於子類將繼承父類中的所有可用的方法;而父類中的某些方法,在子類中可能並不需要。例如,普通員工和經理都繼承自雇員這個介面,員工需要每天寫工作日誌,而經理則不需要。因此不能用工作日誌來卡經理,也就是經理不應該依賴於提交工作日誌這個方法。
可以看出,isp和srp在概念上是有一定交叉的。事實上,很多設計模式在概念上都有交叉,甚至你很難判斷一段**屬於哪一種設計模式。
isp強調的是介面對客戶端的承諾越少越好,並且要做到專一。當某個客戶程式的要求發生變化,而迫使介面發生改變時,影響到其他客戶程式的可能性小。這實際上就是介面汙染的問題。
過於臃腫的介面設計是對介面的汙染。所謂介面汙染就是為介面新增不必要的職責,如果開發人員在介面中增加乙個新功能的主要目的只是減少介面實現類的數目,則此設計將導致介面被不斷地「汙染」並「變胖」。
介面汙染會給系統帶來維護困難和重用性差等方面的問題。為了能夠重用被汙染的介面,介面的實現類就被迫要實現並維護不必要的功能方法。
「介面隔離」其實就是定製化服務設計的原則。使用介面的多重繼承實現對不同的介面的組合,從而對外提供組合功能——達到「按需提供服務」。
看下面的例子
客戶a需要a服務,只要針對客戶a的方法發生改變,客戶b和客戶c就會受到影響。故這種設計需要對介面進行隔離。
在實際應用中,會遇到如下問題:比如,我需要乙個能適配多種型別資料庫的dao實現,那麼首先應實現乙個資料庫操作的介面,其中規定一些資料庫操作的基本方法,如連線資料庫、增刪查改、關閉資料庫等。這是乙個最少功能的介面。對於一些mysql中特有的而其他資料庫不具有或性質不同的方法,如php裡可能用到的mysql的pconnect方法,其他資料庫裡並不存在和這個方法相同的概念,這個方法也就不應該出現在這個基本的介面裡,那這個基本的介面應該有哪些基本的方法呢?pdo已經告訴你了。
pdo是乙個抽象的資料介面層,它告訴我們乙個基本的資料庫操作介面應該實現哪些基本的方法。介面是乙個高層次的抽象,所以介面裡的方法應該是通用的、基本的、不易變化的。
還有乙個問題,那些特有的方法應該怎麼實現?根據isp原則,這些方法可以在另乙個介面中存在,讓這個「異類」同時實現這兩個介面。
對於介面的汙染,可以考慮下面這兩條處理方式:
利用委託分離介面。
利用多繼承分離介面。
物件導向的六原則之介面隔離原則
記得在操作io流時,在最後要關閉流的時候要try catch,流多的時候就有一大堆try catch,如下所示 private void put string path,bitmap bitmap catch filenotfoundexception e finally catch ioexcep...
物件導向設計六原則之 介面隔離原則
1.含義 客戶不應該被強迫使用他們不需要的介面。2.解釋 該原則用於不滿足單一職責原則的情況,客戶只需要知道具有內聚介面的抽象父類即可。3.舉例說明 如果有個辦公一體機,具有印表機,影印機,掃瞄機的功能。對於客戶來說,不需要接觸每個機器,只要接觸辦公一體機。inte cesegregationpri...
設計模式 物件導向設計原則之介面隔離原則
類a通過介面i依賴類b,類c通過介面i依賴類d,如果介面i對於類a和類b來說不是最小介面,則類b和類d必須去實現他們不需要的方法。介面最好大小合適,不臃腫,也不過於細緻。適合於需求,卻不多於需求 不實現它們不需要的方法 客戶端不應該依賴它不需要的介面 乙個類對另乙個類的依賴應該建立在最小的介面上。建...