轉)C 設計模式之七 Adapter

2021-04-30 22:01:41 字數 3212 閱讀 2629

意圖

把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法在一起工作的兩個類能夠在一起工作。

場景

一開始的設計就是,大廳程式是基於介面方式呼叫遊戲程式啟動遊戲場景方法的。在大廳程式開發接近完成的時候,公司決定和另外一家遊戲公司合作,因此希望把大廳程式能適用另乙個遊戲。而這個新遊戲的遵循的是另一套介面。是不是可以避免修改原先呼叫方法來啟動場景呢?或許你會說,既然只有乙個方法修改,那麼修改一下也無妨,我們假設大廳程式和遊戲程式之間有100個介面,其中的大部分都有修改呢?因為遊戲程式介面的修改,大廳程式可能要修改不止100個地方。這樣介面的意義何在呢?

此時可以考慮使用adapter模式來適配這種介面的不匹配情況。

示例**

usingsystem;

usingsystem.collections.generic;

usingsystem.text;

namespaceadapterexample

}

inte***ceigame

classlobby

publicvoidstartgame()

}

classgame

publicvoidenterplayer(intplayerid)

}

classgameadapter:igame

publicvoidenterplayer(stringplayername)

privateintgetplayeridbyplayername(stringplayername)

}

}

**執行結果如下圖:

**說明

l可以看到,原先的介面中,啟動遊戲場景只需要乙個引數,就是遊戲場景名,而進入新的玩家需要提供玩家id(新遊戲都使用玩家id而不使用玩家賬戶名)。

ligame

介面就是介面卡模式中的目標角色,這是客戶所期待的介面。也是針對老的遊戲程式所遵循的介面。

llobby

類相當於呼叫方或者客戶,它原先的**可能是如下的:

igamegame =newgame();

但是由於介面的改變,現在不能直接例項化遊戲類,只能例項化介面卡型別。雖然還是需要改動,但是這個改動是很小的,而且完全可以通過用動態引導程式集來消除這種改動。

lgameadapter

類是介面卡角色,它是介面卡模式的核心,用於把源介面轉變為目標介面。在這裡,我們看到,它實現目標介面。

lgame

型別是源角色,或者說是需要適配的物件。或許它也遵循了另外一套介面,不過我們不是很關心這個,因此**中也沒有體現。

l使用了介面卡模式後,客戶端**沒有做什麼修改。客戶端**老老實實的依賴介面,它並沒有錯,如果因此依賴物件的修改而需要大幅度修改就很無辜了,我們在介面卡中把本來沒有關聯的兩個介面適配在了一起。我們可以看到,介面卡做的不僅僅是換一換方法名,如果源角色和目標角色的差異非常大,那麼介面卡需要做很多任務作。

何時採用

l從**角度來說, 如果需要呼叫的類所遵循的介面並不符合系統的要求或者說並不是客戶所期望的,那麼可以考慮使用介面卡。

l從應用角度來說, 如果因為產品遷移、合作模組的變動,導致雙方一致的介面產生了不一致,或者是希望在兩個關聯不大的型別之間建立一種關係的情況下可以考慮介面卡模式。

實現要點

l介面卡模式是否能成功運用的關鍵在於**本身是否是基於介面程式設計的,如果不是的話,那麼介面卡無能為力。

l介面卡模式的實現很簡單,基本的思想就是介面卡一定是遵循目標介面的。

l介面卡模式的變化比較多,可以通過繼承和組合方式進行適配,介面卡可以是一組介面卡產品,介面卡也可以是抽象型別。

l介面卡模式和facade的區別是,前者是遵循介面的,後者可以是不遵循介面的,比較靈活。

l介面卡模式和proxy的區別是,前者是為物件提供不同的介面,或者為物件提供相同介面,並且前者有一點後補的味道,後者是在設計時就會運用的。

注意事項

l在對兩個無關類進行適配的時候考慮一下適配的代價,乙個非常龐大的介面卡可能會對系統效能有影響。

無廢話C 設計模式之七 Adapter

意圖 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法在一起工作的兩個類能夠在一起工作。場景 一 開始的設計就是,大廳程式是基於介面方式呼叫遊戲程式啟動遊戲場景方法的。在大廳程式開發接近完成的時候,公司決定和另外一家遊戲公司合作,因此希望把大 廳程式能適用另乙個遊戲。而這個新...

設計模式之 七 介面卡模式Adapter

adapter介面卡模式是一種結構型模式,主要應對 由於應用環境的變化,常常需要將 一些現存的物件 放在新的環境中應用,但是,新環境要求的介面是現存物件所不滿足的。設計模式 中說道 將乙個類的介面轉換成客戶希望的另乙個介面。adapter模式使得原本由於介面不相容而不能一起工作的類可以一起工作。在實...

設計模式 之 Adapter

基礎幾何影象物件 如直線 矩形 是很容易實現的,但文字物件就比較複雜了,其中涉及到了文字格式 段落格式 螢幕更新 快取管理等諸多內容。如果此時正好有乙個成熟的文字繪製工具包可供使用,這個工具包中的textview物件提供了完整的文字格式 段落 螢幕及快取管理,實現了textshape物件需要實現的一...