這周工作忙顽悼,就先這樣吧
在本周首先學(xué)習(xí)了面向?qū)ο缶幊痰娜N主要模式:composition 復(fù)合、delegation 委托以及inheritance 繼承走哺。
(1)composition 復(fù)合
在一個類中刁赖,以另一個類作為數(shù)據(jù)成員,這種類與類之間的關(guān)系被稱之復(fù)合僚焦。
在上圖中,使用了類模板的概念曙痘。使用class Sequence = deque芳悲,類似于typedef。將deque替換至代碼中:
在面向?qū)ο笾氨呃ぃ瑥?fù)合就已經(jīng)存在了名扛。例如C語言中的結(jié)構(gòu),結(jié)構(gòu)中就可以存放其他類型的結(jié)構(gòu)茧痒。
注意使用圖表示類與類之間的關(guān)系:
queue擁有deque肮韧,其中的所有的功能都是調(diào)用的deque中的功能,屬于一個特殊的例子文黎。queue是一個先進(jìn)先出的隊列惹苗,而deque為兩端都能進(jìn)出的隊列。deque的功能比queue的功能強(qiáng)大耸峭。deque的部分功能向queue開放桩蓉。該設(shè)計模式稱之為Adapter(適配器)。
從內(nèi)存角度解釋composition:
由Itr至deque至queue劳闹,依次能夠推斷出內(nèi)存的大小院究。
在復(fù)合模式下的構(gòu)造與析構(gòu):
紅色部分代碼是編譯器自動添加的。注意使用的默認(rèn)構(gòu)造函數(shù)本涕。否則需要手動添加合適的構(gòu)造函數(shù)业汰。
(2)delegation 委托
委托嚴(yán)格意義講也是一種復(fù)合,但是是通過指針來進(jìn)行復(fù)合的形式菩颖。其中包含指針样漆,所以注意big three。兩個類通過指針關(guān)聯(lián)晦闰,兩個類的生命周期不同放祟,不是同步的。
左側(cè)可以作為對外的接口呻右,被稱之為pimpl跪妥。Pimpl(pointer to implementation, 指向?qū)崿F(xiàn)的指針)是一種常用的,用來對“類的接口與實(shí)現(xiàn)”進(jìn)行解耦的方法声滥。這個技巧可以避免在頭文件中暴露私有細(xì)節(jié)眉撵,因此是促進(jìn)API接口與實(shí)現(xiàn)保持完全分離的重要機(jī)制。但是Pimpl并不是嚴(yán)格意義上的設(shè)計模式(它是受制于C++特定限制的變通方案),這種慣用法可以看作橋接設(shè)計模式的一種特例纽疟。Handle中的指針可以指向任意類罐韩,右側(cè)的變動不會影響左側(cè),也就不會影響客戶端污朽。此手法也被稱之為編譯防火墻伴逸。
(3)inheritance 繼承
三種模式中,繼承是最為重要的模式膘壶。通過繼承聯(lián)系在一起的類構(gòu)成一種層次關(guān)系,同在在層次的根部有一個基類洲愤,其他類則直接或者間接地從基類繼承而來颓芭,這些集成得到的類為派生類〖泶停基類負(fù)責(zé)定義在層次關(guān)系中所有類共同擁有的成員亡问,而每個派生類定義各自特有的成員。
通過上圖可以看出父類的數(shù)據(jù)是被完整繼承下來的肛宋。
對于繼承關(guān)系中的構(gòu)造與析構(gòu)函數(shù)州藕,主要注意以下兩點(diǎn):
<1>構(gòu)造與析構(gòu)的順序;
<2>基類中的dtor必須是virtual酝陈,否則會出現(xiàn)undefined behavior床玻。
在完成面向?qū)ο蟮娜N基本模式的學(xué)習(xí)之后,對虛函數(shù)以及幾種設(shè)計模式進(jìn)行講解:
(4)虛函數(shù)
通過以下例子對虛函數(shù)有了更為深刻的理解:
Serialize為讀文件沉帮,其中無法統(tǒng)一锈死,繼承自父類,為虛函數(shù)穆壕。通過上述方式待牵,父類中的動作(Serialize)延緩至子類中實(shí)現(xiàn)。該設(shè)計模式為Template Method喇勋。
(5)inheritance與composition下的構(gòu)造與析構(gòu)缨该,應(yīng)當(dāng)記住其相對應(yīng)的順序
(6)設(shè)計模式
Delegation +Inheritance 模式下的Composite模式:
以及Delegation +Inheritance 模式下的Prototype模式:Prototype 模式提供了自我復(fù)制的功能,就是說新對象的創(chuàng)建可以通過已有對象進(jìn)行創(chuàng)建。
作者:游在路上的魚
鏈接:http://www.reibang.com/p/1679e3b6adae
來源:簡書
著作權(quán)歸作者所有川背。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)贰拿,非商業(yè)轉(zhuǎn)載請注明出處。