结构型模式2-组合模式
2018-04-16 本文已影响0人
sunblog
结构型模式2-组合模式
组合模式Composite
意图
将对象组合成属性结构,以表示“部分-整体”的层次结构。composite是的用户对单个对象和组合对象的使用具有一致性。
问题思考
考虑一个容器view,比如listview,包含了很多子view。listview本身也包含在了其他的容器view里,比如GridView。我们的窗口Window如果在这里区分是simple View、listview还是gridview,是没有必要的。window仅需要知道这是个view,知道怎么draw它就可以。
适用性
- 想表示对象的部分-整体层次结构
- 希望忽略组合对象和单个对象的不同,希望统一地使用组合结构中的所有对象。
类图
composite实现
class Component {
public:
virtual void Operation() = 0;
virtual void Add(Component *) {};
virtual void Remove(Component *) {};
virtual Component *GetChild(int n) {};
};
class Composite : public Component {
public:
void Operation() override {
for (auto &e: mComponentList) {
e->Operation();
}
}
void Add(Component *component) override {
for (auto &it : mComponentList) {
if (it == component) {
return; // avoid duplication
}
}
mComponentList.push_back(component);
}
void Remove(Component *component) override {
// different
for (auto it = mComponentList.begin(); it != mComponentList.end(); it++) {
if (*it == component) {
mComponentList.erase(it);
return;
}
}
}
Component *GetChild(int n) override {
if (mComponentList.size() > n) {
return mComponentList.at(n);
}
return nullptr;
}
private:
std::vector<Component*> mComponentList;
};
class ConcreteComponent : public Component {
public:
void Operation() override {
// some operations
}
};
注意:对于普通的component(非组合composite),Add,Remove,Get 这几个composite专属操作是无意义的,但为了保持接口统一,所以仍然存在。在这里我们普通component的对应的方法为空实现。