图片引用于百度
简介:将对象组合成树形结构以表示部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性
优点:可以一致的处理子对象和组合对象,简化客户端代码,能够更加轻松的加入新的子对象,不会因为加入了新的子对象就修改其他对象代码,符合开闭原则
缺点:设计难,要花很多时间理清层次关系
例子背景:现在有一个窗口类,窗口类可以继续添加按钮、文本等子类,而子类不可以再继续添加子类
组合模式代码:
- 抽象基类:
#pragma once
#include <string>
#include <iostream>
#include <list>
using namespace std;
class IComposite
{
public:
IComposite() = default;
virtual ~IComposite() = default;
private:
string m_objName;
public:
virtual void SetObjectName(string objName) { m_objName = objName; }
virtual string GetObjectName() const { return m_objName; }
virtual void ShowWindows() = 0;
protected:
virtual void AddObject(IComposite* obj) = 0;
virtual void RemoveObject(IComposite* obj) = 0;
};
- 组合类:
#pragma once
#include "IComposite.h"
class BaseWindow : public IComposite
{
public:
BaseWindow() {}
virtual ~BaseWindow() {}
protected:
list<IComposite*> m_lstObj;
public:
virtual void ShowWindows()
{
cout << "已显示地基窗口:" << GetObjectName() << endl;
for (auto obj : m_lstObj)
{
obj->ShowWindows();
}
}
virtual void AddObject(IComposite* obj)
{
m_lstObj.push_back(obj);
}
virtual void RemoveObject(IComposite* obj)
{
m_lstObj.remove(obj);
}
};
- 其他子类:
#pragma once
#include "IComposite.h"
class ChildControl : public IComposite
{
public:
ChildControl() {}
virtual ~ChildControl() {}
virtual void ShowWindows()
{
cout << "已显示子控件:" << GetObjectName() << endl;
}
private:
virtual void AddObject(IComposite* obj)
{
cout << "子控件没有此方法" << endl;
}
virtual void RemoveObject(IComposite* obj)
{
cout << "子控件没有此方法" << endl;
}
};
- 引用:
#include "ChildControl.h"
#include "BaseWindow.h"
int main()
{
shared_ptr<ChildControl> c1(new ChildControl);
c1->SetObjectName("按钮1");
shared_ptr<ChildControl> c2(new ChildControl);
c2->SetObjectName("按钮2");
shared_ptr<ChildControl> c3(new ChildControl);
c3->SetObjectName("按钮3");
shared_ptr<BaseWindow> w1(new BaseWindow);
w1->SetObjectName("窗口1");
shared_ptr<BaseWindow> w2(new BaseWindow);
w2->SetObjectName("窗口2");
w1->AddObject(c1.get());
w1->AddObject(c2.get());
w1->AddObject(c3.get());
w2->AddObject(w1.get());
w2->ShowWindows();
getchar();
return 0;
}
总结:
组合模式(Composite):可以实现一些层级结构的设计,例如各种ui设计,一层一层的走,又可以互相添加子类,互相包含,将多个对象组合成树形结构,以此结构来表示“整体-部分”之间的层次关系。
作者:丶梦爱
博客:https://blog.csdn.net/u014732297(转载请说明出处)