不應該強迫客戶依賴於它們不用的方法。
接口隔離可以讓用戶端僅僅關注行爲,而不是實現這種行爲的對象。
例如有一個功能:一個鬧鐘,當定時器超時的時候鬧鐘會響;
1 class Bell 2 { 3 void Ring() 4 { 5 6 } 7 } 8 9 class Timer 10 { 11 void onTimeOut(Bell b) 12 { 13 b.Ring(); 14 } 15 }
這裏面兩個問題,第一、定時器超時是一個timer類依賴於Bell,這個依賴是不必要的,第二、定時器的超時其實很功能很單一,所以我想要它能夠實現其他對象的超時處理,比如說,一個Light超時了會關閉。這樣的話我就要增加一個基類,讓Bell和Light同時從這個類繼承出來。
但是在大多數情況下Light和Bell是完全兩個不同的東西,沒有理由將他們從同一個類繼承。
這時候需要一個接口
1 interface TimeOut 2 { 3 void onTimeOut(); 4 }
這個接口用於實現定時器超時處理。
讓Bell和Light同時繼承這接口
1 class Bell : TimeOut 2 { 3 void onTimeOut() 4 { 5 Ring(); 6 } 7 void Ring() 8 { 9 10 } 11 } 12 class Light : TimeOut 13 { 14 void onTimeOut() 15 { 16 Close(); 17 } 18 void Close() 19 { 20 21 } 22 } 23 class Timer 24 { 25 void onTimeOut(TimeOut t) 26 { 27 t.onTimeOut(); 28 } 29 }
這樣Timer類就是一個非常通用的類,以後我再添加任何對象,只要從TimeOut繼承onTimeOut方法就可以了。
接口的使用有的時候會造成接口的臃腫。
有的時候一個類會依賴於不需要的接口。
如果說ATM有存款,取款,轉賬3部分功能,這三部分功能都會用到UI界面的處理。
爲了使得界面和業務處理分開,所有的業務處理都依賴於接口UI,UI的具體實現用UI object來實現。
這裏面存在一個問題已:UI接口太過於臃腫,因爲Despoit會依賴於他們不需要的接口——withdrawal和transfer,其他的兩個類也是一樣。
解決這種問題的方法是將UI接口拆分掉。
這樣Despoit就不會依賴它不需要的接口了。
分離接口的原則:按照客戶來分離接口,分離客戶就是分離接口。比如這裏按照三種不同的業務來分離UI接口。