组合模式(Composition)
組合模式(Composition)
?
組合模式(Composition)
意圖:將對象組合成樹形結構以表示“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。
應用:組合圖形、文件目錄、GUI容器等。
模式結構:
?
心得:
????? 用戶(Client)通過抽象類(Component)提供的公用接口統一操作基本對象(Leaf)和組合對象(Composite)。抽象對象應該擁有操作基本對象和組合對象的所有接口,但是基本對象應該屏蔽某些組合對象特有的操作,如添加刪除等。組合對象聚合了多個抽象對象,這種一對多的關系和繼承關系正好描述了一種樹形的組合結構。
舉例:
????? 抽象對象看作抽象出來的文件,Leaf看作具體的文件,Composite看作文件夾。那么這個模式描述的是用戶通過操縱一個抽象的文件對象,而不用關系這個對象是文件還是文件夾。文件對象是不允許添加子文件操作的,文件夾對象可以包含多個抽象的文件,即可以是文件也可以子文件夾。按照上述設計結構,C++實現如下:
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;}
};
????? 如果要初始化下邊結構的文件目錄結構并調用操作operation,用戶可以這么操作:
Component*pc1=new?Composite();pc1->add(new?Leaf());
Component*pc2=new?Composite();
pc2->add(new?Leaf());
pc1->add(pc2);
pc1->operation();
delete?pc1;
????? 代碼中需要注意的地方是,抽象基類必須重定義虛析構函數,否則通過基類Component指針無法刪除派生類Composite對象。
????? 使用組合模式的好處從代碼中可以看出來,我們可以對頂層組合對象直接進行調用operation操作,而不需要關心它的內部結構,就像操作Leaf對象一樣,增大的代碼的靈活性。
轉載于:https://www.cnblogs.com/94julia/archive/2013/05/22/3092253.html
總結
以上是生活随笔為你收集整理的组合模式(Composition)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真实临在--摘自{《信仰在我家》}
- 下一篇: simuvex 符号分析形象解释