【設計模式】接口隔離原則

以下內容來自《Java設計模式》

1 接口隔離原則

接口隔離原則定義如下:

接口隔離原則(Interface Segregation Principle, ISP):使用多個專門的接口,而不使用單一 的總接口,即客戶端不應該依賴那些它不需要的接口。

根據接口隔離原則,當一個接口太大時,我們需要將它分割成一些更細小的接口,使用該接 口的客戶端僅需知道與之相關的方法即可。每一個接口應該承擔一種相對獨立的角色,不幹 不該乾的事,該乾的事都要幹。這裏的“接口”往往有兩種不同的含義:一種是指一個類型所具 有的方法特徵的集合,僅僅是一種邏輯上的抽象;另外一種是指某種語言具體的“接口”定義, 有嚴格的定義和結構,比如Java語言中的interface。對於這兩種不同的含義,ISP的表達方式以 及含義都有所不同:

  • 當把“接口”理解成一個類型所提供的所有方法特徵的集合的時候,這就是一種邏輯上的概 念,接口的劃分將直接帶來類型的劃分。可以把接口理解成角色,一個接口只能代表一個角 色,每個角色都有它特定的一個接口,此時,這個原則可以叫做“角色隔離原則”。

  • 如果把“接口”理解成狹義的特定語言的接口,那麼ISP表達的意思是指接口僅僅提供客戶端 需要的行爲,客戶端不需要的行爲則隱藏起來,應當爲客戶端提供儘可能小的單獨的接口, 而不要提供大的總接口。在面向對象編程語言中,實現一個接口就需要實現該接口中定義的 所有方法,因此大的總接口使用起來不一定很方便,爲了使接口的職責單一,需要將大接口 中的方法根據其職責不同分別放在不同的小接口中,以確保每個接口使用起來都較爲方便, 並都承擔某一單一角色。接口應該儘量細化,同時接口中的方法應該儘量少,每個接口中只 包含一個客戶端(如子模塊或業務邏輯類)所需的方法即可,這種機制也稱爲“定製服務”,即 爲不同的客戶端提供寬窄不同的接口。

2 案例分析

下面通過一個簡單實例來加深對接口隔離原則的理解:

Sunny軟件公司開發人員針對某CRM系統的客戶數據顯示模塊設計瞭如圖1所示接口,其中方 法dataRead()用於從文件中讀取數據,方法transformToXML()用於將數據轉換成XML格式,方 法createChart()用於創建圖表,方法displayChart()用於顯示圖表,方法createReport()用於創建文 字報表,方法displayReport()用於顯示文字報表。


在實際使用過程中發現該接口很不靈活,例如如果一個具體的數據顯示類無須進行數據轉換 (源文件本身就是XML格式),但由於實現了該接口,將不得不實現其中聲明的transformToXML()方法(至少需要提供一個空實現);如果需要創建和顯示圖表,除了需實現 與圖表相關的方法外,還需要實現創建和顯示文字報表的方法,否則程序編譯時將報錯。

現使用接口隔離原則對其進行重構。

在圖1中,由於在接口CustomerDataDisplay中定義了太多方法,即該接口承擔了太多職責,一 方面導致該接口的實現類很龐大,在不同的實現類中都不得不實現接口中定義的所有方法, 靈活性較差,如果出現大量的空方法,將導致系統中產生大量的無用代碼,影響代碼質量; 另一方面由於客戶端針對大接口編程,將在一定程序上破壞程序的封裝性,客戶端看到了不 應該看到的方法,沒有爲客戶端定製接口。因此需要將該接口按照接口隔離原則和單一職責 原則進行重構,將其中的一些方法封裝在不同的小接口中,確保每一個接口使用起來都較爲 方便,並都承擔某一單一角色,每個接口中只包含一個客戶端(如模塊或類)所需的方法即 可。

通過使用接口隔離原則,本實例重構後的結構如圖2所示:

在使用接口隔離原則時,我們需要注意控制接口的粒度,接口不能太小,如果太小會導致系 統中接口氾濫,不利於維護;接口也不能太大,太大的接口將違背接口隔離原則,靈活性較 差,使用起來很不方便。一般而言,接口中僅包含爲某一類用戶定製的方法即可,不應該強 迫客戶依賴於那些它們不用的方法。

3 設計模式的七大原則

【設計模式】單一職責原則
【設計模式】開閉原則
【設計模式】里氏替換原則
【設計模式】依賴倒轉原則
【設計模式】接口隔離原則

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章