2026/5/13 22:43:53
网站建设
项目流程
可信网站认证服务商,视频会议,北京海岸设计公司网站,单页竞价网站组合模式#xff1a;将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式的两种实现#xff1a;
透明方式#xff1a;在Component中声明所有用来管理子对象的方法#xff0c;其中包括Add、Remove等。这样…组合模式将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式的两种实现透明方式在Component中声明所有用来管理子对象的方法其中包括Add、Remove等。这样实现Component接口的所有子类都具备了Add和Remove。这样做的好处就是叶节点和枝节点对于外界没有区别它们具备完全一致的行为接口。但问题也很明显因为Leaf类本身不具备Add()、Remove()方法的功能所以实现它是没有意义的。安全方式在Component接口中不去声明Add和Remove方法那么子类的Leaf也就不需要去实现它而是在Composite声明所有用来管理子类对象的方法这样做就不会出现刚才提到的问题不过由于不够透明所以树叶和树枝类将不具有相同的接口客户端的调用需要做相应的判断带来了不便。需求为一家在全国许多城市都有分销机构的大公司做办公管理系统总部有人力资源、财务、运营等部门。需求分析希望总公司的组织结构比如人力资源部、财务部的管理功能可以复用于分公司代码业务类#includestdio.h#includestdlib.h#includestring.htypedefstructCompany{char*name;void(*add)(structCompany*,structCompany*);void(*remove)(structCompany*,structCompany*);void(*display)(structCompany*,int);void(*lineOfDuty)(structCompany*);}Company;typedefstructConcreteCompany{Company base;Company**children;intchildrenNum;}ConcreteCompany;voidConcreteCompanyAdd(Company*obj,Company*child){((ConcreteCompany*)obj)-children[((ConcreteCompany*)obj)-childrenNum]child;}voidConcreteCompanyRemove(Company*obj,Company*child){intn((ConcreteCompany*)obj)-childrenNum;for(inti0;in;i){if(strcmp(((ConcreteCompany*)obj)-children[i]-name,child-name)0){free(((ConcreteCompany*)obj)-children[i]);((ConcreteCompany*)obj)-children[i]((ConcreteCompany*)obj)-children[((ConcreteCompany*)obj)-childrenNum-1];((ConcreteCompany*)obj)-childrenNum--;break;}}}voidConcreteCompanyDisplay(Company*obj,intdepth){for(inti0;idepth;i){printf(-);}printf(%s\n,obj-name);intn((ConcreteCompany*)obj)-childrenNum;for(inti0;in;i){((ConcreteCompany*)obj)-children[i]-display(((ConcreteCompany*)obj)-children[i],depth1);}}voidConcreteCompanyLineOfDuty(Company*obj){intn((ConcreteCompany*)obj)-childrenNum;for(inti0;in;i){((ConcreteCompany*)obj)-children[i]-lineOfDuty(((ConcreteCompany*)obj)-children[i]);}}Company*InitConcreteCompany(char*name){ConcreteCompany*obj(ConcreteCompany*)malloc(sizeof(ConcreteCompany));obj-childrenNum0;// 假设最多10个子公司和部门obj-children(Company**)malloc(sizeof(Company*)*10);obj-base.namename;obj-base.addConcreteCompanyAdd;obj-base.removeConcreteCompanyRemove;obj-base.displayConcreteCompanyDisplay;obj-base.lineOfDutyConcreteCompanyLineOfDuty;return(Company*)obj;}typedefstructHRDepartment{Company base;}HRDepartment;voidHRDepartmentDisplay(Company*obj,intdepth){for(inti0;idepth;i){printf(-);}printf(%s\n,obj-name);}voidHRDepartmentLineOfDuty(Company*obj){printf(%s 员工招聘培训管理\n,obj-name);}Company*InitHRDepartment(char*name){HRDepartment*obj(HRDepartment*)malloc(sizeof(HRDepartment));obj-base.displayHRDepartmentDisplay;obj-base.lineOfDutyHRDepartmentLineOfDuty;obj-base.namename;return(Company*)obj;}typedefstructFinanceDepartment{Company base;}FinanceDepartment;voidFinanceDepartmentDisplay(Company*obj,intdepth){for(inti0;idepth;i){printf(-);}printf(%s\n,obj-name);}voidFinanceDepartmentLineOfDuty(Company*obj){printf(%s 公司财务收支管理\n,obj-name);}Company*InitFinanceDepartment(char*name){FinanceDepartment*obj(FinanceDepartment*)malloc(sizeof(FinanceDepartment));obj-base.displayFinanceDepartmentDisplay;obj-base.lineOfDutyFinanceDepartmentLineOfDuty;obj-base.namename;return(Company*)obj;}客户端隐藏子部门和分公司的区别intmain(){Company*rootInitConcreteCompany(北京总公司);root-add(root,InitHRDepartment(总公司人力资源部));root-add(root,InitFinanceDepartment(总公司财务部));Company*compInitConcreteCompany(上海华东分公司);comp-add(comp,InitHRDepartment(华东分公司人力资源部));comp-add(comp,InitFinanceDepartment(华东分公司财务部));root-add(root,comp);Company*comp1InitConcreteCompany(南京办事处);comp1-add(comp1,InitHRDepartment(南京办事处人力资源部));comp1-add(comp1,InitFinanceDepartment(南京办事处财务部));comp-add(comp,comp1);Company*comp2InitConcreteCompany(杭州办事处);comp2-add(comp2,InitHRDepartment(杭州办事处人力资源部));comp2-add(comp2,InitFinanceDepartment(杭州办事处财务部));comp-add(comp,comp2);printf(结构图\n);root-display(root,0);printf(职责:\n);root-lineOfDuty(root);return0;}客户端打印结构图 北京总公司 -总公司人力资源部 -总公司财务部 -上海华东分公司 --华东分公司人力资源部 --华东分公司财务部 --南京办事处 ---南京办事处人力资源部 ---南京办事处财务部 --杭州办事处 ---杭州办事处人力资源部 ---杭州办事处财务部 职责: 总公司人力资源部 员工招聘培训管理 总公司财务部 公司财务收支管理 华东分公司人力资源部 员工招聘培训管理 华东分公司财务部 公司财务收支管理 南京办事处人力资源部 员工招聘培训管理 南京办事处财务部 公司财务收支管理 杭州办事处人力资源部 员工招聘培训管理 杭州办事处财务部 公司财务收支管理UML图总结组合模式使用场景“当你发现需求中是体现部分与整体层次的结构时以及你希望用户可以忽略组合对象与单个对象的不同统一地使用组合结构中的所有对象时就应该考虑用组合模式了。”