15、组合模式(Composite)
来源:互联网 发布:矩阵a与b相似,a e与b e 编辑:程序博客网 时间:2024/05/20 15:11
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合的使用具有一致性。
main(),客户
CCorpNode,抽象基类,实现基本信息
CBranchNode,树枝节点,实现Addordinate()函数和GetSubordinate()函数
CLeafNode,叶子节点,IsLeaf属性总是“true”
说明:组合模式主要是实现在CBranchNode对象里增加对其它对象的数组,如vector<CCorpNode*>,数组里可以存放CBranchNode和CLeafNode对象。这样方便进行遍历操作。
注意:组合模式有透明组合模式和安全组合模式。透明组合模式是将Addordinate和GetSubordinate这两个函数也抽象到CCorpNode基类里,这增加了操作叶子节点的难度,更易出现逻辑问题。所以尽量使用安全模式。
简单理解:组合模式有点像合并同类项
具体的整体调用如下:
int main()
{
//未使用模式的调用。
no_use_composite();
cout << endl << endl;
//使用组合模式后的调用。
use_composite();
return 0;
}
void use_composite()
{
CBranchNode root("赵大", "总经理", 100000);
CBranchNode devDep("钱大", "研发部门经理", 10000);
CBranchNode saleDep("孙大", "销售部门经理", 20000);
CBranchNode financeDep("李大", "财务部门经理", 30000);
CBranchNode firstDevGroup("周三也斜", "开发一组组长", 5000);
CBranchNode secondDevGroup("吴大棒槌", "开发二组组长", 6000);
CLeafNode a("a", "开发人员", 2000);
CLeafNode b("b", "开发人员", 2000);
CLeafNode c("c", "开发人员", 2000);
CLeafNode d("d", "开发人员", 2000);
CLeafNode e("e", "开发人员", 2000);
CLeafNode f("f", "开发人员", 2000);
CLeafNode g("g", "开发人员", 2000);
CLeafNode h("h", "开发人员", 5000);
CLeafNode i("i", "开发人员", 4000);
CLeafNode j("j", "开发人员", 5000);
CLeafNode k("k", "CEO秘书", 8000);
CLeafNode zheng("郑老六", "研发部副经理", 20000);
root.Add(&k);//CEO有三个部门经理和一个秘书
root.Add(&devDep);
root.Add(&saleDep);
root.Add(&financeDep);
devDep.Add(&zheng);//开发部有一个副经理和两个小组
devDep.Add(&firstDevGroup);
devDep.Add(&secondDevGroup);
firstDevGroup.Add(&a);
firstDevGroup.Add(&b);
firstDevGroup.Add(&c);
secondDevGroup.Add(&d);
secondDevGroup.Add(&e);
secondDevGroup.Add(&f);
saleDep.Add(&g);
saleDep.Add(&h);
financeDep.Add(&i);
financeDep.Add(&j);
cout << root.GetInfo().c_str() << endl;
cout << GetTreeInfo(&root).c_str() << endl;
}
main(),客户
CCorpNode,抽象基类,实现基本信息
CBranchNode,树枝节点,实现Addordinate()函数和GetSubordinate()函数
CLeafNode,叶子节点,IsLeaf属性总是“true”
说明:组合模式主要是实现在CBranchNode对象里增加对其它对象的数组,如vector<CCorpNode*>,数组里可以存放CBranchNode和CLeafNode对象。这样方便进行遍历操作。
注意:组合模式有透明组合模式和安全组合模式。透明组合模式是将Addordinate和GetSubordinate这两个函数也抽象到CCorpNode基类里,这增加了操作叶子节点的难度,更易出现逻辑问题。所以尽量使用安全模式。
简单理解:组合模式有点像合并同类项
具体的整体调用如下:
int main()
{
//未使用模式的调用。
no_use_composite();
cout << endl << endl;
//使用组合模式后的调用。
use_composite();
return 0;
}
void use_composite()
{
CBranchNode root("赵大", "总经理", 100000);
CBranchNode devDep("钱大", "研发部门经理", 10000);
CBranchNode saleDep("孙大", "销售部门经理", 20000);
CBranchNode financeDep("李大", "财务部门经理", 30000);
CBranchNode firstDevGroup("周三也斜", "开发一组组长", 5000);
CBranchNode secondDevGroup("吴大棒槌", "开发二组组长", 6000);
CLeafNode a("a", "开发人员", 2000);
CLeafNode b("b", "开发人员", 2000);
CLeafNode c("c", "开发人员", 2000);
CLeafNode d("d", "开发人员", 2000);
CLeafNode e("e", "开发人员", 2000);
CLeafNode f("f", "开发人员", 2000);
CLeafNode g("g", "开发人员", 2000);
CLeafNode h("h", "开发人员", 5000);
CLeafNode i("i", "开发人员", 4000);
CLeafNode j("j", "开发人员", 5000);
CLeafNode k("k", "CEO秘书", 8000);
CLeafNode zheng("郑老六", "研发部副经理", 20000);
root.Add(&k);//CEO有三个部门经理和一个秘书
root.Add(&devDep);
root.Add(&saleDep);
root.Add(&financeDep);
devDep.Add(&zheng);//开发部有一个副经理和两个小组
devDep.Add(&firstDevGroup);
devDep.Add(&secondDevGroup);
firstDevGroup.Add(&a);
firstDevGroup.Add(&b);
firstDevGroup.Add(&c);
secondDevGroup.Add(&d);
secondDevGroup.Add(&e);
secondDevGroup.Add(&f);
saleDep.Add(&g);
saleDep.Add(&h);
financeDep.Add(&i);
financeDep.Add(&j);
cout << root.GetInfo().c_str() << endl;
cout << GetTreeInfo(&root).c_str() << endl;
}
0 0
- 15、组合模式(Composite)
- 组合模式(Composite)
- 组合模式(Composite)
- Composite(组合模式)
- 组合(Composite)模式
- 组合模式(Composite)
- composite(组合)模式
- Composite(组合)模式
- 组合模式(Composite)
- 组合(composite)模式
- 组合模式(Composite)
- 组合模式(Composite)
- 组合模式(Composite)
- 组合模式(Composite)
- 组合模式(Composite)
- Composite(组合模式)
- 组合模式(Composite)
- 组合模式(Composite)
- linggle 使用方法汇集[转]
- Javase----异常部分基础习题(毕向东Java基础)
- Android 照片压缩
- 自动化测试--Ant
- Mac下通过Wireshark和rvictl网络监听iPhone应用
- 15、组合模式(Composite)
- datatable 选择指定行 对行进行相关操作.
- iOS 时间戳 详解
- linux CentOS6.5安装Oracle11g——傻瓜笔记
- shell编程--中级篇
- 自动化测试--TestNG
- shell编程- -高级篇
- VC 宏定义使用
- 三种Java创建线程的方式(Callable,FutureTask)