日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

接口隔离原则(ISP)

發(fā)布時(shí)間:2024/7/23 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接口隔离原则(ISP) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

接口隔離原則(The Interface Segregation Interface)

?

????????這個(gè)原則用來(lái)處理“胖(fat)”接口(類的接口不是內(nèi)聚的)所具有的缺點(diǎn)。“胖”接口可以分解成多組方法。


考慮一個(gè)安全系統(tǒng),有一些Door對(duì)象,可以被加鎖和解鎖,并且Door對(duì)象知道自己開關(guān)狀態(tài)。

public interface Door {public void lock();public void unlock();public boolean isOpen(); }

考慮一個(gè)這樣的實(shí)現(xiàn),TimedDoor 如果門開著的時(shí)間過長(zhǎng),它就會(huì)發(fā)出警報(bào)聲。為了做到這一點(diǎn),TimedDoor 對(duì)象需要和另一個(gè)名為Timer 的對(duì)象交互。

public interface Timer {// 注冊(cè)超時(shí)服務(wù)public void register(int timeout, TimerClient client); }public interface TimerClient {// 超時(shí)后執(zhí)行public void timeout(); }

如果一個(gè)對(duì)象希望得到超時(shí)通知,它可以調(diào)用Timer 的register 函數(shù)。我們?cè)鯓訉imeClient 類
和TimedDoor 類聯(lián)系起來(lái),才能在超時(shí)時(shí)通知到TimedDoor 中相應(yīng)的處理代碼呢?如下是一個(gè)容易想到的解決方案。

?這個(gè)方案最主要的問題:現(xiàn)在Door 類依賴TimeClient 了。可是并不是所有種類的Door 都需要定時(shí)功能。

分離客戶就是分離接口

? ? ? ? Door 接口和TimerClient 接口是被完全不同的客戶程序使用的。Timer 使用TimerClient,而操作門的類使用Door。既然客戶程序是分離的,所以接口也應(yīng)該保持分離。

客戶對(duì)接口施加的反作用力

? ? ? ? 例如,有些Timer 的使用者會(huì)注冊(cè)多個(gè)超時(shí)通知請(qǐng)求。比如對(duì)于TimedDoor 來(lái)說(shuō)。當(dāng)它檢測(cè)到門被打開時(shí),會(huì)向Timer 發(fā)送一個(gè)register() 消息,請(qǐng)求一個(gè)超時(shí)通知。可是,在超時(shí)到達(dá)前,門關(guān)上了,關(guān)閉一會(huì)兒后又被再次打開。這就導(dǎo)致在原先的超時(shí)到達(dá)前又注冊(cè)了一個(gè)新的超時(shí)請(qǐng)求。最后,最初的超時(shí)到達(dá),TimedDoor 的 timeout() 方法被調(diào)用。Door 錯(cuò)誤地發(fā)出了警報(bào)。

? ? ? ? 修復(fù),在每次超時(shí)注冊(cè)中都包含一個(gè)唯一的 timeoutID 碼,并在調(diào)用TimerClient 的timeout() 方法時(shí),再次使用該標(biāo)識(shí)碼。

public interface Timer {// 注冊(cè)超時(shí)服務(wù)public void register(int timeout, int timeoutID, TimerClient client); }public interface TimerClient {// 超時(shí)后執(zhí)行public void timeout(int timeoutID); }

????????顯然,這個(gè)改變會(huì)影響到TimerClient 的所有使用者。還會(huì)影響到Door 以及Door 的所有客戶程序。這是僵化性和粘滯性的臭味。

接口隔離原則(ISP)

? ? ? ? 不應(yīng)該強(qiáng)迫客戶依賴于它們不用的方法。

1、使用委托分離接口

?

public TimedDoor implements Door {public void doorTimeout(int timeoutID);// 其他接口方法實(shí)現(xiàn)... }public class DoorTimeAdapter implements TimerClient {private TimedDoor itsTimeDoor;public DoorTimeAdapter(TimedDoor theDoor) {this.itsTimeDoor = theDoor;}public void timeout(int timeoutID) {itsTimeDoor.doorTimeout(timeoutID);} }

2、使用多重繼承分離接口(推薦

?

總結(jié)

以上是生活随笔為你收集整理的接口隔离原则(ISP)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。