介面卡模式是專案開發後的補救模式,就像一些人家裡存放的創可貼,不一定會用到,但是以防萬一。所以在專案搭建框架時是不要考慮使用介面卡
模式,只有出現了意外情況了,這時可以考慮通過介面卡模式,使得專案改動較小。
介面卡模式分為兩種定製介面卡和預設介面卡。其中定製介面卡又分為類介面卡和物件介面卡。
首先是類介面卡,該介面卡的適配目標是介面(或者是抽象類):
public
class
typeadapter
}inte***ce
targetinte***ce
class
jarclass
}class
jarclasstotargetinte***ceadapter
extends
jarclass
implements
targetinte***ce
}
控制台輸出:
這是jar包中乙個類中的方法
這是目標介面中的有用方法
這裡模擬的是jar包中有個已經實現好的類(jarclass ),也要通過目標介面(targetinte***ce )來呼叫,而且要使用原先的方法,
這裡就通過介面卡來實現了該功能,主要的方法是新建乙個類繼承要進行適配的類(這裡是jarclass ),並且實現目標介面(這裡是targetinte***ce )
這樣一來得到的新類就是滿足要求的類,這就是類介面卡的使用。
接著是物件介面卡,因為在現實中目標物件可能是已經實現好的類
public
class objectadapter
}class targetclass
public
void
methodsec()
public
void
methodthi()
}class jarclazz
}class jarclazztotargetclassadapter extends jarclazz
public
void
methodsec()
public
void
methodthi()
}
控制台輸出
這是jar包中的類方法
這是目標類的方法一
這是目標類的方法二
這是目標類的方法三
這裡通過在介面卡類(jarclazztotargetclassadapter )中新建目標物件(targetclass )的方法來適配為目標物件,
並且介面卡中的呼叫目標物件的方法和目標物件中已有的方法名是一樣的,這樣通過組合的方式和**模式中的靜態**有些類似,
不過靜態**可能只是**一部分方法,而且還可能對方法進行變動,而介面卡是基本不做改動的(要改動也是可以的,看具體情況)。
最後在理解下預設介面卡,這個介面卡是在抽象類和介面定義時違反了介面隔離原則下的補救方法。
inte***ce
zoo
這裡定義了乙個動物介面,有兩個方法,後面別人去實現時發現不是所有動物都有必要都實現這兩個方法,比如貓、狗、牛等,只要乙個會跑的方法
就可以了,如果實現了zoo方法,這些類中都會有乙個空的沒內容的會飛的方法,這時使用預設介面卡就能解決這個問題。
class
notflyzooadapter
implements
zoo
@override
public
void canfly()
}
通過實現類先去實現這個介面,後面的不會飛的動物只需要繼承該介面卡介面就可以了,重寫其中的canrun();這樣一來就避免了每個不會飛的動物中都有乙個空的canfly()。
這三種介面卡都是對原先設計中存在的問題就行補救的方法,如果一開始就設計合理,也就不會使用到介面卡了,
正所謂「智者千慮,必有一失」,了解介面卡模式,相當於對出現了「一失」情況下的如何處理。
介面卡模式的理解
介面卡模式用於 系統的資料和行為都正確,但介面不符時,應該考慮用介面卡,目的是使控制範圍之外的乙個原有物件與某個介面匹配。介面卡模式主要應用於希望復用一些現存的類,但是介面又與復用環境要求不一致的情況,比如在需要對早期 復用一些功能等應用上很有實際價值。自己翻譯就是 已經有了乙個早期的抽象的介面或者...
設計模式中的介面卡模式
將乙個類的介面轉換成客戶希望的另外乙個介面。adapter模式使得原本由於介面不相容而不能一起工作的那些類可以在一起工作。比如 現在有個手機要充電,手機是5v的介面,我要用電源是220v的powera介面去充電,即呼叫power的方法charge 然而charge 只提供220v電源,而我們還有個5...
PHP的設計模式 介面卡模式
適用性 1 你想使用乙個已經存在的類,而它的介面不符合你的需求 2 你想建立乙個可以復用的類,該類可以與其他不相關的類或不可預見的類協同工作 3 你想使用乙個已經存在的子類,但是不可能對每乙個都進行子類化以匹配它們的介面。物件介面卡可以適配它的父類介面 僅限於物件介面卡 介面卡模式 inte ce ...