介面卡模式(adapter pattern)是作為兩個不相容的介面之間的橋梁。這種型別的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。
意圖:將乙個類的介面轉換成客戶希望的另外乙個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
主要解決:主要解決在軟體系統中,常常要將一些"現存的物件"放到新的環境中,而新環境要求的介面是現物件不能滿足的。
何時使用:1、系統需要使用現有的類,而此類的介面不符合系統的需要。 2、想要建立乙個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作,這些源類不一定有一致的介面。 3、通過介面轉換,將乙個類插入另乙個類系中。(比如老虎和飛禽,現在多了乙個飛虎,在不增加實體的需求下,增加乙個介面卡,在裡面包容乙個虎物件,實現飛的介面。)
優點:1、可以讓任何兩個沒有關聯的類一起執行。 2、提高了類的復用。 3、增加了類的透明度。 4、靈活性好。
缺點:1、過多地使用介面卡,會讓系統非常零亂,不易整體進行把握。比如,明明看到呼叫的是 a 介面,其實內部被適配成了 b 介面的實現,乙個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用介面卡,而是直接對系統進行重構。
使用場景:有動機地修改乙個正常執行的系統的介面,這時應該考慮使用介面卡模式。
注意事項:介面卡不是在詳細設計時新增的,而是解決正在服役的專案的問題。
#include#include#include
using
namespace
std;
class mediaplayer;
};class advancedmediaplayer
virtual
void playmp4(string
filename) {}
};//
步驟 2 建立實現了 advancedmediaplayer 介面的實體類
class vlcplayer : public
advancedmediaplayer
void playmp4(string
filename)
};class mp4player: public
advancedmediaplayer
void playmp4(string
filename)
};//
步驟 3 建立實現了 mediaplayer 介面的介面卡類
class mediaadapter : public
mediaplayer
else
if (audiotype.compare("
mp4") == 0
) }
void play(string audiotype, string
filename)
else
if (audiotype.compare("
mp4") == 0
) }
mediaadapter()
~mediaadapter()
};//
步驟 4 建立實現了 mediaplayer 介面的實體類
class audioplayer : public
mediaplayer
//else
if (audiotype.compare("
vlc") == 0
|| audiotype.compare("
mp4") == 0
)
else
}};//
intmain()
結構型模式之介面卡模式
介面卡模式 物件介面卡模式結構 target 目標抽象類 目標抽象類定義客戶所需介面,可以是乙個抽象類或介面,也可以是具體類。adapter 介面卡類 介面卡可以呼叫另乙個介面,作為乙個轉換器,對adaptee和target進行適配。在物件介面卡模式中,介面卡類通過繼承target並關聯乙個adap...
結構型模式之介面卡模式
如果在系統中存在不相容的介面,可以通過引入乙個介面卡來使得原本因為介面不相容而不能一起工作的兩個類可以協同工作。介面卡模式包括類介面卡和物件介面卡。類介面卡 實現 1 目標抽象類 public inte ce robot 2 適配者類 public class dogpublic void run ...
結構型模式 介面卡模式
介面卡模式 將乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。介面卡模式角色目標 targe 角色 該角色定義要轉換成的目標介面 源 adaptee 角色 需要被轉換成目標角色的源角色 介面卡 adapter 角色 該角色是介面卡模式的核心,...