設計模式 (5)介面卡模式

2022-03-13 04:10:47 字數 3003 閱讀 3386

介面卡模式

介面卡模式把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法在一起工作的兩個類能夠在一起工作。比如說我的hp筆記本,美國產品,人家美國的電壓是110v的,而我們中國的電壓是220v,要在中國能使用,必須找個變壓器轉一下電壓才可以。這個變壓器就是個介面卡。

介面卡模式有類介面卡和物件介面卡兩種模式。

使用第三方庫的時候,第三方的庫肯定不能適用所有的系統,所以需要乙個介面卡來轉換。

1.遮蔽了具體的實現方式,實現了依賴倒轉。

2.可以把不統一的介面封裝起來,使之成為統一的介面。

3.把本來不方便適用的介面轉換成統一的介面。

類介面卡

為了使客戶能夠使用adaptee類,提供乙個中間環節,即類adapter類,adapter類實現了target介面,並繼承自adaptee,adapter類的request方法重新封裝了adaptee的specificrequest方法,實現了適配的目的。

因為adapter與adaptee是繼承的關係,所以這決定了這個介面卡模式是類的。

目標(target)角色: 這是客戶所期待的介面。因為c#不支援多繼承,所以target必須是介面,不可以是類。

源(adaptee)角色: 需要適配的類。

介面卡(adapter)角色: 把源介面轉換成目標介面。這一角色必須是類。

實現:

#includeusing

namespace

std;

//目標介面類,客戶需要的介面

class

target

; };

//需要適配的類

class

adaptee

};

//類模式,介面卡類,通過public繼承獲得介面繼承的效果

class adapter : public adaptee, public

target

};

intmain()

物件介面卡

由於adapter與adaptee是委派關係,這決定了這個介面卡模式是物件的。

目標(target)角色:這是客戶所期待的介面。目標可以是具體的或抽象的類,也可以是介面。

源(adaptee)角色:需要適配的類。

介面卡(adapter)角色:通過在內部包裝(wrap)乙個adaptee物件,把源介面轉換成目標介面。

實現:

#includeusing

namespace

std;

//目標介面類,客戶需要的介面

class

target;};

//需要適配的類

class

adaptee

};//

類模式,介面卡類,通過public繼承獲得介面繼承的效果

class adapter : public

target

void

request()

};int

main()

佇列介面卡

下面例子便於理解,可參考(

#include #include 

using

namespace

std;

//雙端佇列

class

deque

void push_front(int x)

void pop_back()

void pop_front()

};

//順序容器

class

sequence

; //

棧 class stack: public

sequence

void

pop()

private

: deque deque;

//雙端佇列

};

//佇列

class queue: public

sequence

void

pop()

private

: deque deque;

//雙端佇列

};

intmain()

實現要點

1.adapter模式主要應用於「希望復用一些現存的類,但是介面又與復用環境要求不一致的情況」,在遺留**復用、類庫遷移等方面非常有用。

2.adapter模式有物件介面卡和類介面卡兩種形式的實現結構,但是類介面卡採用「多繼承」的實現方式,帶來了不良的高耦合,所以一般不推薦使用。物件介面卡採用「物件組合」的方式,更符合松耦合精神。

3.adapter模式的實現可以非常的靈活,不必拘泥於gof23中定義的兩種結構。例如,完全可以將adapter模式中的「現存物件」作為新的介面方法引數,來達到適配的目的。

4.adapter模式本身要求我們盡可能地使用「面向介面的程式設計」風格,這樣才能在後期很方便的適配。

適用性

在以下各種情況下使用介面卡模式:

1.系統需要使用現有的類,而此類的介面不符合系統的需要。

2.想要建立乙個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。這些源類不一定有很複雜的介面。

3.(對物件介面卡而言)在設計裡,需要改變多個已有子類的介面,如果使用類的介面卡模式,就要針對每乙個子類做乙個介面卡,而這不太實際。

參考:

設計模式 介面卡模式 類介面卡 物件介面卡

乙個小例子,便於理解,上 這是我們造的。現在想用這個方法。public class adaptee 類介面卡。對我們想要的方法封裝一下,target就能像之前一樣,呼叫request方法即可。public class adapter1 extends adaptee implements targe...

設計模式之介面卡模式(類介面卡模式)

介面卡模式,即定義乙個包裝類,用於包裝不相容介面的物件 包裝類 介面卡adapter 被包裝物件 適配者adaptee 被適配的類 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式的形式分為 類的介面卡模式和物件的介面卡模式 模式原理...

設計模式 介面卡模式

01 02 author rollen holt 設計模式之 介面卡模式 03 04 05 inte ce window 11 12 abstract class windowadapter 16 public void close 19 public void activated 22 publi...