無廢話C 設計模式之七 Adapter

2021-04-24 00:29:44 字數 3204 閱讀 3007

意圖

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

場景

一 開始的設計就是,大廳程式是基於介面方式呼叫遊戲程式啟動遊戲場景方法的。在大廳程式開發接近完成的時候,公司決定和另外一家遊戲公司合作,因此希望把大 廳程式能適用另乙個遊戲。而這個新遊戲的遵循的是另一套介面。是不是可以避免修改原先呼叫方法來啟動場景呢?或許你會說,既然只有乙個方法修改,那麼修改 一下也無妨,我們假設大廳程式和遊戲程式之間有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 設計模式之九 Proxy

意圖 為其他物件提供一種 以控制對這個物件的訪問。場景 模式非常常用,大致的思想就是通過為物件加乙個 來降低物件的使用複雜度 或是提公升物件使用的友好度 或是提高物件使用的效率。在現實生活中也有很多 的角色,比如明星的經紀人,他就是一種 經紀人為明星處理很多對外的事情,目的是為了節省被 物件也就是明...

無廢話C 設計模式 002

執行結果如下圖 說明 weapon是抽象構件角色。rifle是具體構件角色,實現抽象構件的介面。decorator是裝飾角色。裝飾角色有兩個特點,一是繼承了抽象構件的介面,二是有乙個構件角色的例項。enhance和wear是具體裝飾角色,它們負責給構件附加責任。客戶端在使用裝飾角色的時候並沒有針對抽...

(原創)無廢話C 設計模式之八 Facade

無廢話c 設計模式之八 facade 意圖 為子系統中的一組介面提供乙個一致的介面,facade模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。場景 在乙個為遊戲充值的 中,建立訂單需要與三個外部介面打交道 l使用者系統 根據使用者名稱獲取使用者id 檢視使用者是否已經啟用了遊戲 l卡系...