国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

[BoolanC++微專業(yè)] Week3筆記

2019-11-08 20:19:19
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本周的課程主要講的是面向?qū)ο笤O(shè)計(jì)與設(shè)計(jì)模式的入門。 一、面向?qū)ο髮?duì)編程: 主要存在三種模式即: 繼承(Ineritance): 通過(guò)繼承聯(lián)系在一起的類構(gòu)成一種層次關(guān)系,同在在層次的根部有一個(gè)基類,其他類則直接或者間接地從基類繼承而來(lái),這些集成得到的類為派生類。基類負(fù)責(zé)定義在層次關(guān)系中所有類共同擁有的成員,而每個(gè)派生類定義各自特有的成員。 這里寫圖片描述 圖中的_List_node便是即是繼承自 _List_node_base。派生類i必須通過(guò)使用派生類列表明確指出他是從哪個(gè)基類繼承而來(lái)。派生類列表的形式是:首先一個(gè)冒號(hào),后面緊跟以逗號(hào)分割的基類列表。在上一個(gè)程序中,派生類列表是

struct _List_node:public _List_node_base { /// }

在C++語(yǔ)言中,基類必須將兩種成員函數(shù)區(qū)分開(kāi)來(lái),一種是希望其派生類進(jìn)行覆蓋的函數(shù),一種是不希望派生類進(jìn)行覆蓋的函數(shù),對(duì)于前者,基類通常將其定義為虛函數(shù)(virtul)當(dāng)我們使用指針或者調(diào)用虛函數(shù)時(shí),該調(diào)用被動(dòng)態(tài)綁定。任何構(gòu)造函數(shù)之外的非靜態(tài)函數(shù)都可以是虛函數(shù),即使它沒(méi)有被定義為virtul。如果一個(gè)基類把一個(gè)函數(shù)聲明成虛函數(shù),那么該函數(shù)在派生類中隱式的也是虛函數(shù)。 1)template method: 這里寫圖片描述 在面向?qū)ο笙到y(tǒng)的分析與設(shè)計(jì)過(guò)程中經(jīng)常會(huì)遇到這樣一種情況:對(duì)于某一個(gè)業(yè)務(wù)邏輯(算法實(shí)現(xiàn))在不同的對(duì)象中有不同的細(xì)節(jié)實(shí)現(xiàn),但是邏輯(算法)的框架(或通用的應(yīng)用算法)是相同的。Template 提供了這種情況的一個(gè)實(shí)現(xiàn)框架。Template 模式是采用繼承的方式實(shí)現(xiàn)這一點(diǎn):將邏輯(算法)框架放在抽象基類中,并定義好細(xì)節(jié)的接口,子類中實(shí)現(xiàn)細(xì)節(jié)。 2)oberver: Observer 模式要解決的問(wèn)題為:建立一個(gè)一(Subject)對(duì)多(Observer)的依賴關(guān)系,并且做到當(dāng)“一”變化的時(shí)候,依賴這個(gè)“一”的多也能夠同步改變。最常見(jiàn)的一個(gè)例子就是:對(duì)同一組數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析時(shí)候,我們希望 能夠提供多種形式的表示(例如以表格進(jìn)行統(tǒng)計(jì)顯示、柱狀圖統(tǒng)計(jì)顯示、百分比統(tǒng)計(jì)顯示等)。這些表示都依賴于同一組數(shù)據(jù),我們當(dāng)然需要當(dāng)數(shù)據(jù)改變的時(shí)候,所有的統(tǒng)計(jì)的顯示都能夠同時(shí)改變。Observer 模式就是解決了這一個(gè)問(wèn)題。 這里寫圖片描述 3)composite: 在開(kāi)發(fā)中,我們經(jīng)常可能要遞歸構(gòu)建樹(shù)狀的組合結(jié)構(gòu),Composite 模式則提供了很好的 解決方案。 這里寫圖片描述 這里寫圖片描述 3)PRototype: Prototype 模式提供了自我復(fù)制的功能,就是說(shuō)新對(duì)象的創(chuàng)建可以通過(guò)已有對(duì)象進(jìn)行創(chuàng)建。在 C++中拷貝構(gòu)造函數(shù)(Copy Constructor)曾經(jīng)是很對(duì)程序員的噩夢(mèng),淺層拷貝和深層拷貝的魔魘也是很多程序員在面試時(shí)候的快餐和系統(tǒng)崩潰時(shí)候的根源之一。 這里寫圖片描述

復(fù)合(Compositon): 在一個(gè)類中,以另一個(gè)類的對(duì)象做為數(shù)據(jù)成員的,稱為復(fù)合,也被稱為類的組合。 這里寫圖片描述 compostion即為在一個(gè)類中包含有另一個(gè)類的模式(has a),在此例中,即在queue類中包含了一個(gè)類。主要的好處是將類的功能分離,在修改時(shí)候便于修改。并且在編寫代碼時(shí)能最大程度的對(duì)已使用代碼進(jìn)行復(fù)用,減小工作量。其與繼承最本質(zhì)上的區(qū)別就是一個(gè)為橫向,一個(gè)為縱向。舉個(gè)例子,student和teacher是兩個(gè)不同的類,兩個(gè)類都由類person派生,此為繼承。student和teacher都有手機(jī),此時(shí)手機(jī)是一個(gè)單獨(dú)的類,而手機(jī)與student還有teacher兩個(gè)類,互為復(fù)合的關(guān)系。 通過(guò)復(fù)合的關(guān)系,我們還派生出一種設(shè)計(jì)模式,叫Adapter,請(qǐng)看下面的代碼: 這里寫圖片描述 在此代碼中,queue的所有行為,全部是由deque這個(gè)類導(dǎo)出來(lái)的,本身自己沒(méi)有實(shí)現(xiàn)任何多余的功能,此模式既為Adapter。

Adapter 模式解決的問(wèn)題在生活中經(jīng)常會(huì)遇到:比如我們有一個(gè) Team 為外界提供 S 類服務(wù),但是我們 Team 里面沒(méi)有能夠完成此項(xiàng)人物的 member,然后我們得知有 A 可以完成這項(xiàng)服務(wù)(他把這項(xiàng)人物重新取了個(gè)名字叫 S’,并且他不對(duì)外公布他的具體實(shí)現(xiàn))。為了保證我們對(duì)外的服務(wù)類別的一致性(提供 S 服務(wù)),我們有以下兩種方式解決這個(gè)問(wèn)題: 1)把 B 君直接招安到我們 Team 為我們工作,提供 S 服務(wù)的時(shí)候讓 B 君去辦就是了; 2)B 君可能在別的地方有工作,并且不準(zhǔn)備接受我們的招安,于是我們 Team 可以想這樣一種方式解決問(wèn)題:我們安排 C 君去完成這項(xiàng)任務(wù),并做好工作(Money:))讓 A 君工作的時(shí)候可以向 B 君請(qǐng)教,因此 C 君就是一個(gè)復(fù)合體(提供 S 服務(wù),但是是 B 君的繼承弟子)。 實(shí)際上在軟件系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)中,這種問(wèn)題也會(huì)經(jīng)常遇到:我們?yōu)榱送瓿赡稠?xiàng)工作購(gòu)買了一個(gè)第三方的庫(kù)來(lái)加快開(kāi)發(fā)。這就帶來(lái)了一個(gè)問(wèn)題:我們?cè)趹?yīng)用程序中已經(jīng)設(shè)計(jì)好了接口,與這個(gè)第三方提供的接口不一致,為了使得這些接口不兼容的類(不能在一起工作)可以在一起工作了,Adapter 模式提供了將一個(gè)類(第三方庫(kù))的接口轉(zhuǎn)化為客戶(購(gòu)買使用者)希望的接口。在上面生活中問(wèn)題的解決方式也就正好對(duì)應(yīng)了 Adapter 模式的兩種類別:類模式和對(duì)象模式。類模式一般用集成的方式實(shí)現(xiàn),對(duì)象模式一般使用委托的方式實(shí)現(xiàn)。 這里寫圖片描述 這里寫圖片描述

在復(fù)合模式下,構(gòu)造由內(nèi)向外構(gòu)造,而析構(gòu)由外向內(nèi)析構(gòu)。就像建一所房子,從地基打起,但是拆一所房子,要從房頂拆起。

委托(Delegation): 委托嚴(yán)格意義講也是一種復(fù)合,但是是通過(guò)指針來(lái)進(jìn)行復(fù)合的形式。侯老師通過(guò)一個(gè)設(shè)計(jì)模式pimpl對(duì)這一內(nèi)容進(jìn)行了講解。 這里寫圖片描述 Pimpl(pointer to implementation, 指向?qū)崿F(xiàn)的指針)是一種常用的,用來(lái)對(duì)“類的接口與實(shí)現(xiàn)”進(jìn)行解耦的方法。這個(gè)技巧可以避免在頭文件中暴露私有細(xì)節(jié)(見(jiàn)下圖1),因此是促進(jìn)API接口與實(shí)現(xiàn)保持完全分離的重要機(jī)制。但是Pimpl并不是嚴(yán)格意義上的設(shè)計(jì)模式(它是受制于C++特定限制的變通方案),這種慣用法可以看作橋接設(shè)計(jì)模式的一種特例。

這里寫圖片描述

使用Pimpl主要存在以下幾個(gè)優(yōu)點(diǎn): 降低耦合 信息隱藏 降低編譯依賴,提高編譯速度 接口與實(shí)現(xiàn)分離


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 额敏县| 启东市| 开鲁县| 苏尼特左旗| 丰原市| 竹溪县| 明溪县| 黔南| 汉寿县| 莫力| 长泰县| 舞钢市| 辛集市| 乌恰县| 赤峰市| 阿克苏市| 龙南县| 安溪县| 根河市| 洪雅县| 都江堰市| 宜兰市| 集安市| 麻阳| 晋江市| 武穴市| 崇义县| 盐边县| 林口县| 新田县| 木里| 岳普湖县| 石林| 汉沽区| 镇雄县| 苍南县| 寿宁县| 廉江市| 千阳县| 巴彦淖尔市| 平塘县|