有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
这个例子是最常见的UI元素。比如,一个Panel可以包括button 和eidtview等等,其实这3个元素都是一个View
代码
#include <iostream>
#include <vector>
using namespace std;
class View{
public:
virtual void show() = 0;
virtual void add(View *) = 0;
virtual void remove(View *) = 0;
virtual View * getChild(int index) = 0;
};
class Button:public View {
public:
void show() {cout<<"Button"<<endl;}
void add(View *) {}
void remove(View *) {}
View * getChild(int index) {return NULL;}
};
class EditView:public View {
public:
void show() {cout<<"EditView"<<endl;}
void add(View *) {}
void remove(View *) {}
View * getChild(int index) {return NULL;}
};
class Panel:public View{
public:
void show() {
int num = vec.size();
cout<<"panel----start"<<endl;
for (int i = 0; i < num; i++) {
vec[i]->show();
}
cout<<"panel----end"<<endl;
}
void add(View * v) {
vec.push_back(v);
}
void remove(View * v){
int num = vec.size();
for (int i = 0; i < num; i++) {
if(vec[i] == v) {vec.pop_back();return ;}
}
}
View * getChild(int index){
return vec[index];
}
private:
vector<View *> vec;
};
使用
int main(){
View *v = new Button();
View *panel = new Panel();
panel->add(v);
v = new EditView();
panel->add(v);
panel->show();
return 1;
}
结果
panel----start
Button
EditView
panel----end