Java設計模式——接口隔離原則

接口隔離原則講的是,使用多個專門的接口比使用單一的總接口要好。換言之,從一個客戶類的角度來講,一個類對另外一個類的依賴性應當是建立在最小的接口上的。

一、什麼是接口隔離原則?

“接口”有兩種含義。一種是Java語言中的有嚴格定義的Interface結構,比如java.lang.Runnale就是一個Java接口;另外一種就是一個類所具有的方法特徵的集合,也稱作“接口”,但是隻是一種邏輯上的抽象。

角色的合理劃分

將“接口”理解爲一個類所提供的所有方法的特徵集合,也就是一種在邏輯上才存在的概念。這樣的話,接口的劃分就直接是類型的劃分

一個接口相當於劇本中的一種角色,而此角色在一個舞臺上由哪個演員來演則相當於接口的實現。因此,一個接口應當簡單的代表一個角色,而不是多個角色。如果系統涉及到多個角色的話,那麼每一個角色都應該由一個特定的接口代表。

定製服務

將“接口”理解爲狹義的Java接口,接口隔離原則講的就是爲同一個角色提供寬、窄不同的接口,以對付不同的客戶端

在下面的示意性類圖中,有一個角色Service以及三個不同的客戶端。這三個客戶端需要的服務都是稍稍不同的,因此係統分別爲他們提供了三個不同的Java接口,即IService1、IService2和IService3。顯然,每一個Java接口都僅僅將客戶端需要的行爲暴露給客戶端,而沒有將客戶端所不需要的行爲放到接口中。實際上這是適配器模式的應用。


接口污染

過於臃腫的接口是對接口的污染(Interface Contamination)。將沒有關係的接口合併在一起,形成一個臃腫的大接口,是對角色和接口的污染。

準確而恰當的劃分角色以及角色所對應的接口,是面向對象的設計的一個重要的組成部分。

二、角色隔離原則的例子

從代碼重構的角度,如何將一個臃腫的角色重新分割成更爲合適的小角色?

反面例子

如下圖所示,一個叫做BadExample的接口負責所有的操作,從提供搜索功能到建立索引的功能,甚至包括搜索結果集合的功能均在一個接口內提供。明顯的違反了角色隔離原則,把不同功能的接口放在了一起,由一個接口給出了包括搜索器角色、索引生成器角色以及搜索結果集角色。


角色的分割

如下圖所示,在圖中可以看出,搜索引擎的功能被分割爲三個角色。


  • 搜索器角色
  • 索引生成器角色
  • 搜索結果集角色

以索引生成器角色爲例,由於索引生成因數據的格式不同而不同,故分爲RdbIndexer和FileIndexer兩種實現。FileIndexer類代表對諸如*.txt,*.html,*.doc以及*.pdf等文件類型的數據生成全文索引,而RdbIndexer則針對關係數據庫的數據進行全文索引生成。這兩個實現扮演的同爲索引生成器角色。

搜索器角色是與索引生成器角色完全不同的角色,它提供用戶全文搜索功能。用戶傳進一些關鍵字,搜索器角色則返回一個ResultSet對象。

搜索結果角色就是ResultSet,它給用戶提供對集合進行迭代走訪的功能。如first()將光標移到集合的第一個元素;last()將光標移到集合的最後一個元素;next()將光標移到集合的下一個元素;previous()將光標移到集合的上一個元素;而getExcerpt()則返回當前記錄的摘要;而getFullRecord()則將記錄的全文返回。

發佈了11 篇原創文章 · 獲贊 10 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章