设计模式C++实现 —— 外观模式、组合模式
外觀模式應(yīng)該是用的很多的一種模式,特別是當(dāng)一個系統(tǒng)很復(fù)雜時,系統(tǒng)提供給客戶的是一個簡單的對外接口,而把里面復(fù)雜的結(jié)構(gòu)都封裝了起來??蛻糁恍枋褂眠@些簡單接口就能使用這個系統(tǒng),而不需要關(guān)注內(nèi)部復(fù)雜的結(jié)構(gòu)。DP一書的定義:為子系統(tǒng)中的一組接口提供一個一致的界面, 外觀模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。舉個編譯器的例子,假設(shè)編譯一個程序需要經(jīng)過四個步驟:詞法分析、語法分析、中間代碼生成、機(jī)器碼生成。學(xué)過編譯都知道,每一步都很復(fù)雜。對于編譯器這個系統(tǒng),就可以使用外觀模式??梢远x一個高層接口,比如名為Compiler的類,里面有一個名為Run的函數(shù)??蛻糁恍枵{(diào)用這個函數(shù)就可以編譯程序,至于Run函數(shù)內(nèi)部的具體操作,客戶無需知道。下面給出UML圖,以編譯器為實(shí)例。
? ? ? ? 相應(yīng)的代碼實(shí)現(xiàn)為:
[cpp]?view plaincopyprint?? ? ? ?客戶使用方式:
[cpp]?view plaincopyprint?
? ? ? ?結(jié)合上面編譯器這個例子,進(jìn)一步說明。對于(1),編譯器類對客戶屏蔽了子系統(tǒng)組件,客戶只需處理編譯器的對象就可以方便的使用子系統(tǒng)。對于(2),子系統(tǒng)的變化,不會影響到客戶的使用,體現(xiàn)了子系統(tǒng)與客戶的松耦合關(guān)系。對于(3),如果客戶希望使用詞法分析器,只需定義詞法分析的類對象即可,并不受到限制。
? ? ? 外觀模式在構(gòu)建大型系統(tǒng)時非常有用。接下來介紹另一種模式,稱為組合模式。感覺有點(diǎn)像外觀模式,剛才我們實(shí)現(xiàn)外觀模式時,在Compiler這個類中包含了多個類的對象,就像把這些類組合在了一起。組合模式是不是這個意思,有點(diǎn)相似,其實(shí)不然。
? ? ? DP書上給出的定義:將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。組合使得用戶對單個對象和組合對象的使用具有一致性。注意兩個字“樹形”。這種樹形結(jié)構(gòu)在現(xiàn)實(shí)生活中隨處可見,比如一個集團(tuán)公司,它有一個母公司,下設(shè)很多家子公司。不管是母公司還是子公司,都有各自直屬的財務(wù)部、人力資源部、銷售部等。對于母公司來說,不論是子公司,還是直屬的財務(wù)部、人力資源部,都是它的部門。整個公司的部門拓?fù)鋱D就是一個樹形結(jié)構(gòu)。
? ? ? 下面給出組合模式的UML圖。從圖中可以看到,FinanceDepartment、HRDepartment兩個類作為葉結(jié)點(diǎn),因此沒有定義添加函數(shù)。而ConcreteCompany類可以作為中間結(jié)點(diǎn),所以可以有添加函數(shù)。那么怎么添加呢?這個類中定義了一個鏈表,用來放添加的元素。
? ? ? ?相應(yīng)的代碼實(shí)現(xiàn)為:
[cpp]?view plaincopyprint?? ? ? ? ?客戶使用方式:
[cpp]?view plaincopyprint?
? ? ? ? 上面的實(shí)現(xiàn)方式有缺點(diǎn),就是內(nèi)存的釋放不好,需要客戶自己動手,非常不方便。有待改進(jìn),比較好的做法是讓ConcreteCompany類來釋放。因?yàn)樗械闹羔樁际谴嬖贑oncreteCompany類的鏈表中。C++的麻煩,沒有垃圾回收機(jī)制。
? ? ? ??本人享有博客文章的版權(quán),轉(zhuǎn)載請標(biāo)明出處 http://blog.csdn.net/wuzhekai1985
總結(jié)
以上是生活随笔為你收集整理的设计模式C++实现 —— 外观模式、组合模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神舟十四号发射成功正与空间站对接:首次上
- 下一篇: s3c2440移植MQTT