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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

组合模式(Composition)

發(fā)布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 组合模式(Composition) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

組合模式(Composition

?

組合模式(Composition)

意圖:將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對單個對象和組合對象的使用具有一致性。

應(yīng)用:組合圖形、文件目錄、GUI容器等。

模式結(jié)構(gòu)

?

心得

????? 用戶(Client)通過抽象類(Component)提供的公用接口統(tǒng)一操作基本對象(Leaf)和組合對象(Composite)。抽象對象應(yīng)該擁有操作基本對象和組合對象的所有接口,但是基本對象應(yīng)該屏蔽某些組合對象特有的操作,如添加刪除等。組合對象聚合了多個抽象對象,這種一對多的關(guān)系和繼承關(guān)系正好描述了一種樹形的組合結(jié)構(gòu)。

舉例

????? 抽象對象看作抽象出來的文件,Leaf看作具體的文件,Composite看作文件夾。那么這個模式描述的是用戶通過操縱一個抽象的文件對象,而不用關(guān)系這個對象是文件還是文件夾。文件對象是不允許添加子文件操作的,文件夾對象可以包含多個抽象的文件,即可以是文件也可以子文件夾。按照上述設(shè)計結(jié)構(gòu),C++實現(xiàn)如下:

class?Component
{
public:
????virtual?void?operation()=0;
????virtual?void?add(Component*)=0;
????virtual?void?remove(Component*)=0;
????virtual?Component*?getChild(int?i)=0;
????virtual?~Component(){}
};
class?Composite:public?Component
{
????list<Component*>?children;
public:
????virtual?void?operation()
????{
????????cout<<"組合對象(";
????????for(list<Component*>::iterator?it=children.begin();it!=children.end();++it)
????????{
????????????(*it)->operation();
????????????cout<<"?";
????????}
????????cout<<")";
????}
????virtual?void?add(Component*pc)
????{
????????children.push_back(pc);
????}
????virtual?void?remove(Component*pc)
????{
????????children.remove(pc);
????}
????virtual?Component*?getChild(int?i)
????{
????????list<Component*>::iterator?it;
????????for(it=children.begin();it!=children.end()&&(i>0);++it,--i);
????????return?*it;
????}
????virtual?~Composite()
????{
????????for(list<Component*>::iterator?it=children.begin();it!=children.end();++it)
????????{
????????????delete?*it;
????????}
????}
};
class?Leaf:public?Component
{
public:
????virtual?void?operation()
????{
????????cout<<"基本對象";
????}
????virtual?void?add(Component*pc){}
????virtual?void?remove(Component*pc){}
????virtual?Component*?getChild(int?i){return?NULL;}
};

????? 如果要初始化下邊結(jié)構(gòu)的文件目錄結(jié)構(gòu)并調(diào)用操作operation,用戶可以這么操作:

Component*pc1=new?Composite();
pc1->add(new?Leaf());
Component*pc2=new?Composite();
pc2->add(new?Leaf());
pc1->add(pc2);
pc1->operation();
delete?pc1;

????? 代碼中需要注意的地方是,抽象基類必須重定義虛析構(gòu)函數(shù),否則通過基類Component指針無法刪除派生類Composite對象。

????? 使用組合模式的好處從代碼中可以看出來,我們可以對頂層組合對象直接進(jìn)行調(diào)用operation操作,而不需要關(guān)心它的內(nèi)部結(jié)構(gòu),就像操作Leaf對象一樣,增大的代碼的靈活性。

轉(zhuǎn)載于:https://www.cnblogs.com/94julia/archive/2013/05/22/3092253.html

總結(jié)

以上是生活随笔為你收集整理的组合模式(Composition)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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