先决条件:复合设计模式
复合模式是业界使用最广泛的模式之一,它解决了一个非常重要且微妙的问题。每当用户想要以与单个对象集合相同的方式对待单个对象时,就可以使用它,例如,您可能希望将副本中的页面视为与整个副本相同的页面,而整个副本基本上是页面的集合,或者如果要创建某些事物的层次结构,则可能需要将整个事物视为对象。
将对象组合到树结构中以表示部分整个层次结构。复合可以使客户统一对待单个对象和对象组成。
在Photoshop中,我们绘制了许多单独的对象,然后这些对象组成了一个完整的唯一对象,您可能要对整个对象而不是每个单独的对象应用某些操作。
在此图的此处,您可以看到Composite和Leaf实现了Component图,因此可以对两个对象进行相同的操作,但是重要的部分是Composite类,该类还包含由黑色菱形符号表示的Composite对象之间的组成关系的Component Objects。和Component类。
然后如何设计我们的班级以适应这种情况。我们将通过实现我们的复制示例来尝试理解它。假设您必须创建一个页面,该页面具有添加,删除,删除等操作,以及一个副本,该副本将具有与各个页面相同的操作。
这种情况最好用复合模式处理。
// 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元素和下层UI元素都响应相同的事件和动作。
参考 :
1.复合模式c#
2.复合图案