接口隔離ISP

不應該強迫客戶依賴於它們不用的方法。

接口隔離可以讓用戶端僅僅關注行爲,而不是實現這種行爲的對象。

例如有一個功能:一個鬧鐘,當定時器超時的時候鬧鐘會響;

 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接口。

 

 

 

 

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