先决条件:复合设计模式
复合模式是行业中使用最广泛的模式之一,解决了一个非常重要和微妙的问题。当用户希望以与这些单个对象的集合相同的方式处理单个对象时使用它,例如,您可能希望将副本中的页面视为与整个副本相同,整个副本基本上是页面的集合或如果您想创建某个事物的层次结构,您可能希望将整个事物视为对象。
将对象组合成树结构以表示部分-整体层次结构。 Composite 允许客户端统一处理单个对象和对象的组合。
在 photoshop 的情况下,我们绘制了许多单独的对象,然后这些对象组成了一个完整的独特对象,您可能希望对整个对象而不是每个单独的对象应用一些操作。
在这张图中,你可以看到复合和叶都实现了组件图,因此允许对两个对象进行相同的操作,但重要的部分是复合类,它也包含组件对象,用黑色菱形表示复合之间的组合关系和组件类。
那么如何设计我们的类来适应这样的场景。我们将尝试通过实现我们的复制示例来理解它。假设您必须创建一个页面,该页面具有添加、删除、删除等操作以及一个副本,该副本将具有与各个页面相同的操作。
这种情况最好用复合模式处理。
// CPP program to illustrate
// Composite design pattern
#include
#include
using namespace std;
class PageObject {
public:
virtual void Add(PageObject a)
{
}
virtual void Remove()
{
}
virtual void Delete(PageObject a)
{
}
};
class Page : public PageObject {
public:
void Add(PageObject a)
{
cout << "something is added to the page" << endl;
}
void Remove()
{
cout << "soemthing is removed from the page" << endl;
}
void Delete(PageObject a)
{
cout << "soemthing is deleted from page " << endl;
}
};
class Copy : public PageObject {
vector copyPages;
public:
void AddElement(PageObject a)
{
copyPages.push_back(a);
}
void Add(PageObject a)
{
cout << "something is added to the copy" << endl;
}
void Remove()
{
cout << "something is removed from the copy" << endl;
}
void Delete(PageObject a)
{
cout << "something is deleted from the copy";
}
};
int main()
{
Page a;
Page b;
Copy allcopy;
allcopy.AddElement(a);
allcopy.AddElement(b);
allcopy.Add(a);
a.Add(b);
allcopy.Remove();
b.Remove();
return 0;
}
something is added to the copy
something is added to the page
something is removed from the copy
soemthing is removed from the page
现在,可以应用于单个对象并且也可以应用于这些单个对象的集合的相同操作使得处理由较小的独立对象组成的较大对象变得非常容易。
复合模式最显着的例子出现在任何 UI 工具包中。考虑 UI 元素的情况,其中每个 UI 顶级 UI 元素由许多较小的独立低级 UI 元素组成,并且顶级和低级 UI 元素都响应相同的事件和操作。
参考 :
1.复合模式c#
2. 复合模式