日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

设计模式C++实现 —— 外观模式、组合模式

發(fā)布時間:2023/12/10 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式C++实现 —— 外观模式、组合模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

外觀模式應(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?
  • class?Scanner??
  • {??
  • public:??
  • ????void?Scan()?{?cout<<"詞法分析"<<endl;?}??
  • };??
  • class?Parser??
  • {??
  • public:??
  • ????void?Parse()?{?cout<<"語法分析"<<endl;?}??
  • };??
  • class?GenMidCode??
  • {??
  • public:??
  • ????void?GenCode()?{?cout<<"產(chǎn)生中間代碼"<<endl;?}??
  • };??
  • class?GenMachineCode??
  • {??
  • public:??
  • ????void?GenCode()?{?cout<<"產(chǎn)生機(jī)器碼"<<endl;}??
  • };??
  • //高層接口??
  • class?Compiler??
  • {??
  • public:??
  • ????void?Run()???
  • ????{??
  • ????????Scanner?scanner;??
  • ????????Parser?parser;??
  • ????????GenMidCode?genMidCode;??
  • ????????GenMachineCode?genMacCode;??
  • ????????scanner.Scan();??
  • ????????parser.Parse();??
  • ????????genMidCode.GenCode();??
  • ????????genMacCode.GenCode();??
  • ????}??
  • };??
  • ? ? ? ?客戶使用方式:

    [cpp]?view plaincopyprint?
  • int?main()??
  • {??
  • ????Compiler?compiler;??
  • ????compiler.Run();??
  • ????return?0;??
  • }??
  • ? ? ? ?這就是外觀模式,它有幾個特點(diǎn)(摘自DP一書),(1)它對客戶屏蔽子系統(tǒng)組件,因而減少了客戶處理的對象的數(shù)目并使得子系統(tǒng)使用起來更加方便。(2)它實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,而子系統(tǒng)內(nèi)部的功能組件往往是緊耦合的。(3)如果應(yīng)用需要,它并不限制它們使用子系統(tǒng)類。

    ? ? ? ?結(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?
  • class?Company????
  • {??
  • public:??
  • ????Company(string?name)?{?m_name?=?name;?}??
  • ????virtual?~Company(){}??
  • ????virtual?void?Add(Company?*pCom){}??
  • ????virtual?void?Show(int?depth)?{}??
  • protected:??
  • ????string?m_name;??
  • };??
  • //具體公司??
  • class?ConcreteCompany?:?public?Company????
  • {??
  • public:??
  • ????ConcreteCompany(string?name):?Company(name)?{}??
  • ????virtual?~ConcreteCompany()?{}??
  • ????void?Add(Company?*pCom)?{?m_listCompany.push_back(pCom);?}?//位于樹的中間,可以增加子樹??
  • ????void?Show(int?depth)??
  • ????{??
  • ????????for(int?i?=?0;i?<?depth;?i++)??
  • ????????????cout<<"-";??
  • ????????cout<<m_name<<endl;??
  • ????????list<Company?*>::iterator?iter=m_listCompany.begin();??
  • ????????for(;?iter?!=?m_listCompany.end();?iter++)?//顯示下層結(jié)點(diǎn)??
  • ????????????(*iter)->Show(depth?+?2);??
  • ????}??
  • private:??
  • ????list<Company?*>?m_listCompany;??
  • };??
  • //具體的部門,財務(wù)部??
  • class?FinanceDepartment?:?public?Company???
  • {??
  • public:??
  • ????FinanceDepartment(string?name):Company(name){}??
  • ????virtual?~FinanceDepartment()?{}??
  • ????virtual?void?Show(int?depth)?//只需顯示,無限添加函數(shù),因?yàn)橐咽侨~結(jié)點(diǎn)??
  • ????{??
  • ????????for(int?i?=?0;?i?<?depth;?i++)??
  • ????????????cout<<"-";??
  • ????????cout<<m_name<<endl;??
  • ????}??
  • };??
  • //具體的部門,人力資源部??
  • class?HRDepartment?:public?Company????
  • {??
  • public:??
  • ????HRDepartment(string?name):Company(name){}??
  • ????virtual?~HRDepartment()?{}??
  • ????virtual?void?Show(int?depth)?//只需顯示,無限添加函數(shù),因?yàn)橐咽侨~結(jié)點(diǎn)??
  • ????{??
  • ????????for(int?i?=?0;?i?<?depth;?i++)??
  • ????????????cout<<"-";??
  • ????????cout<<m_name<<endl;??
  • ????}??
  • };??
  • ? ? ? ? ?客戶使用方式:

    [cpp]?view plaincopyprint?
  • int?main()??
  • {??
  • ????Company?*root?=?new?ConcreteCompany("總公司");??
  • ????Company?*leaf1=new?FinanceDepartment("財務(wù)部");??
  • ????Company?*leaf2=new?HRDepartment("人力資源部");??
  • ????root->Add(leaf1);??
  • ????root->Add(leaf2);??
  • ??
  • ????//分公司A??
  • ????Company?*mid1?=?new?ConcreteCompany("分公司A");??
  • ????Company?*leaf3=new?FinanceDepartment("財務(wù)部");??
  • ????Company?*leaf4=new?HRDepartment("人力資源部");??
  • ????mid1->Add(leaf3);??
  • ????mid1->Add(leaf4);??
  • ????root->Add(mid1);??
  • ????//分公司B??
  • ????Company?*mid2=new?ConcreteCompany("分公司B");??
  • ????FinanceDepartment?*leaf5=new?FinanceDepartment("財務(wù)部");??
  • ????HRDepartment?*leaf6=new?HRDepartment("人力資源部");??
  • ????mid2->Add(leaf5);??
  • ????mid2->Add(leaf6);??
  • ????root->Add(mid2);??
  • ????root->Show(0);??
  • ??
  • ????delete?leaf1;?delete?leaf2;??
  • ????delete?leaf3;?delete?leaf4;??
  • ????delete?leaf5;?delete?leaf6;???
  • ????delete?mid1;?delete?mid2;??
  • ????delete?root;??
  • ????return?0;??
  • }??
  • ? ? ? ? 上面的實(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。