[GoF設計模式]Bridge模式和Template模式的C++實現

【Bridge模式】

使用組合的方式將功能的需求的抽象和實現解耦,這樣一來抽象和實現可以分別獨自的變化。由此解決需求變更可能帶來的麻煩,即類的迅速膨脹,如一般的情況下抽象和實現可能需要M*N個類來解決問題,而使用Bridge模式則只需要M+N個類來解決問題。此處的“實現”是指“怎麼實現用戶的需求”,並且通過組合的方式來實現。此處的實現不是指繼承基類,實現基類接口,而是通過組合實現用戶的需求。Bridge模式是設計模式中複雜求難理解的模式之一。

【圖解】

以中國人喫飯用筷子,美國人喫飯用叉子,當然中國人也可以用叉子喫飯,美國人也可以用筷子喫飯 爲例,當然這種情況下用和不用都是定義4個類來實現的,但是當增加到三種情況下時候,運用Bridge模式只定義3+3=6個類,而不用則需要3*3需要9個類。如在加上印度人喫飯用手。簡單起見,只列兩個。

1

【程序】

 

 

 

 

 

 

 

【輸出】

1


 

【Template模式】

對於某一業務邏輯存在不同的細節實現,但總體邏輯框架是相同的。Template模式用於解決這樣的問題,strategy模式和他解決的問題類似,但前者是採用集成的方式,封裝的是框架,二後者採用的組合的方式,封裝的算法。在Template模式中,在模板類(抽象類)的中將原子操作聲明爲Protected保護類型,而僅提供算法框架的函數供外界調用。

值得說明的是Template模式採用的集成方式是一種反向依賴(DIP,Dependency Inversion Principles)的方式,即父類調用了子類的接口實現(基類調用了派生類的操作)。Template模式的不足是在於其原子操作在各派生類中的細節實現不能被複用,這個問題也是繼承自同一個基類說共有的問題。Strategy模式側重在組合上,將算法封裝到一個類中(如:AddOperation),並採用組合的方式解決(實現MathOperation類)。

【圖解】

這個例子只做示例用,沒寫太具體。比如“字符串的模式匹配算法”中有KMP算法,也有前端時間知道的BM算法,這兩個算法大體上滿足一種邏輯框架,既用模板字符串匹配樣本字符串的過程中, 首先匹配樣本字符串中的字符串片段,如果沒匹配成功,這由連續匹配的字符數,以及當前起始匹配的位置以及模板字符串的長度,計算出在樣本字符串中的下一跳批配開始的位置,直到匹配成功。而BM算法是從模板字符串的後面向前面開始比,二KMP則是從前往後。BM和KMP算法在計算下一條位置的實現上也有所不同。以下只是Template模式的示範,並不涉及字符串模式匹配算法的具體實現。

1

 

【程序】

 

 

 

 

【輸出】

 

 

3

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章