這篇文章主要介紹了介面隔離原則,小編覺得蠻不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧
定義:客戶端不應該依賴它不需要的介面;一個類別對另一個類別的依賴應該建立在最小的介面上。
問題由來:類別A透過介面I依賴類別B,類別C透過介面I依賴類別D,如果介面I對於類別A和類別B來說不是最小接口,則類別B和類別D必須去實作他們不需要的方法。
解決方案:將臃腫的接口I拆分為獨立的幾個接口,類A和類C分別與他們需要的接口建立依賴關係。也就是採用介面隔離原則。
舉例來說明介面隔離原則:
(圖1 未遵循介面隔離原則的設計)
這個圖的意思是:類別A依賴介面I中的方法1、方法2、方法3,類別B是對類別A依賴的實作。類別C依賴介面I中的方法1、方法4、方法5,類別D是對類別C依賴的實作。對於類別B和類別D來說,雖然他們都存在著用不到的方法(也就是圖中紅色字體標記的方法),但由於實作了介面I,所以也必須實作這些用不到的方法。對類別圖不熟悉的可以參考程式碼來理解,程式碼如下:
interface I { public void method1(); public void method2(); public void method3(); public void method4(); public void method5(); } class A{ public void depend1(I i){ i.method1(); } public void depend2(I i){ i.method2(); } public void depend3(I i){ i.method3(); } } class B implements I{ public void method1() { System.out.println("类B实现接口I的方法1"); } public void method2() { System.out.println("类B实现接口I的方法2"); } public void method3() { System.out.println("类B实现接口I的方法3"); } //对于类B来说,method4和method5不是必需的,但是由于接口A中有这两个方法, //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。 public void method4() {} public void method5() {} } class C{ public void depend1(I i){ i.method1(); } public void depend2(I i){ i.method4(); } public void depend3(I i){ i.method5(); } } class D implements I{ public void method1() { System.out.println("类D实现接口I的方法1"); } //对于类D来说,method2和method3不是必需的,但是由于接口A中有这两个方法, //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。 public void method2() {} public void method3() {} public void method4() { System.out.println("类D实现接口I的方法4"); } public void method5() { System.out.println("类D实现接口I的方法5"); } } public class Client{ public static void main(String[] args){ A a = new A(); a.depend1(new B()); a.depend2(new B()); a.depend3(new B()); C c = new C(); c.depend1(new D()); c.depend2(new D()); c.depend3(new D()); } }
可以看到,如果介面過於臃腫,只要介面中出現的方法,不管對依賴它的類別有沒有用處,實作類別中都必須去實作這些方法,這顯然不是好的設計。如果將這個設計修改為符合介面隔離原則,就必須將介面I進行拆分。這裡我們將原有的介面I拆分為三個接口,拆分後的設計如圖2所示:
(圖2 遵循接口隔離原則的設計)
照例貼出程式的程式碼,供不熟悉類別圖的朋友參考:
interface I1 { public void method1(); } interface I2 { public void method2(); public void method3(); } interface I3 { public void method4(); public void method5(); } class A{ public void depend1(I1 i){ i.method1(); } public void depend2(I2 i){ i.method2(); } public void depend3(I2 i){ i.method3(); } } class B implements I1, I2{ public void method1() { System.out.println("类B实现接口I1的方法1"); } public void method2() { System.out.println("类B实现接口I2的方法2"); } public void method3() { System.out.println("类B实现接口I2的方法3"); } } class C{ public void depend1(I1 i){ i.method1(); } public void depend2(I3 i){ i.method4(); } public void depend3(I3 i){ i.method5(); } } class D implements I1, I3{ public void method1() { System.out.println("类D实现接口I1的方法1"); } public void method4() { System.out.println("类D实现接口I3的方法4"); } public void method5() { System.out.println("类D实现接口I3的方法5"); } }
介面隔離原則的意義是:建立單一接口,不要建立龐大臃腫的接口,盡量細化接口,接口中的方法盡量少。也就是說,我們要為各個類別建立專用的接口,而不要試圖去建立一個很龐大的接口供所有依賴它的類別去調用。本文範例中,將一個龐大的介面變更為3個專用的介面所採用的就是介面隔離原則。在程式設計中,依賴幾個專用的介面要比依賴一個綜合的介面更靈活。接口是設計時對外部設定的“契約”,透過分散定義多個接口,可以預防外來變更的擴散,提高系統的靈活性和可維護性。
說到這裡,很多人會覺的介面隔離原則跟之前的單一職責原則很相似,其實不然。其一,單一職責原則原註重的是職責;而介面隔離原則注重對介面依賴的隔離。其二,單一職責原則主要是約束類,其次才是接口和方法,它針對的是程序中的實現和細節;而接口隔離原則主要約束接口接口,主要針對抽象,針對程序整體框架的構建。
採用介面隔離原則對介面進行約束時,要注意以下幾點:
#介面盡量小,但是要有限。對介面進行細化可以提高程式設計彈性是不掙的事實,但是如果過小,則會造成介面數量過多,使設計複雜化。所以一定要適量。
為依賴介面的類別自訂服務,只暴露給呼叫的類別它需要的方法,它不需要的方法則隱藏起來。只有專注地為一個模組提供客製化服務,才能建立最小的依賴關係。
提高內聚,減少對外互動。使介面用最少的方法去完成最多的事情。
運用介面隔離原則,一定要適度,介面設計的過大或過小都不好。設計介面的時候,只有多花點時間去思考、籌劃,才能準確地實踐這項原則
以上是Java中介面隔離原則的實例講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

禪工作室 13.0.1
強大的PHP整合開發環境