当前位置: 首页 > 科技观察

设计模式之复合模式深入剖析

时间:2023-03-21 18:19:36 科技观察

1.复合模式(CompositePattern)简介,又称局部整体模式,按照树结构来组合对象,用来表示局部和整体整体水平。组合模式一般用于描述整体与部分的关系。它将对象组织成树结构。最顶层的节点称为根节点。根节点可以包含分支节点和叶节点,分支节点可以包含分支节点。和叶节点。如下图所示:在组合模式下,分支节点和叶子节点被认为是相同的数据类型(定义相同的接口),因此它们具有一致的行为。这样整个树结构中的对象都是同一个类型,带来的好处是客户不需要区分分支节点还是叶子节点,可以直接操作,给客户带来了极大的方便。从设计的角度来看,组合模式涉及三个角色:抽象根节点:它是一个抽象接口,它定义了算法;具体节点:实现或继承抽象根节点,完成具体的算法运算;client:客户端类提出使用特定类型的请求;2.例子下面,我们以学校的组织结构为例。例如,一个学校由后勤系、网络系、教学系、保卫系、分校组成。每个分校还设有后勤部、网络部等。由于这些部门都是学校的部门,所以基本操作应该是一样的,我们可以把所有的部门都拉到学校属性中。类图如下所示:实现过程如下!/***学校界面*/publicinterfaceSchool{/***添加分校或系*@paramschool*/voidaddPart(Schoolschool);/***删除分校或系*@paramschool*/voidremovePart(Schoolschool);/***显示分校或系信息*/voiddisplayPart();}然后,创建一个学校具体实现类ConcreteSchool,可以是主校也可以是分校,如下:/***具体学校可以是主校或分校*/publicclassConcreteSchoolimplementsSchool{privateStringname;//NameprivateListpartList=newArrayList<>();publicConcreteSchool(Stringname){this.name=name;}@OverridepublicvoidaddPart(Schoolschool){partList.add(school);}@OverridepublicvoidremovePart(Schoolschool){partList.remove(school);}/***学校查看部门信息*/@OverridepublicvoiddisplayPart(){for(Schoolschool:partList){school.displayPart();}}}接下来创建两个具体的部门,InternetDepartment和SecurityDepartment,代码如下:学校){}@OverridepublicvoidremovePart(学校){}@OverridepublicvoiddisplayPart(){System.out.println("我是"+name+",负责学校的网管工作");}}/***安全部*/publicclassSecurityDepartmentimplementsSchool{privateStringname;//名称publicSecurityDepartment(Stringname){this.name=name;}@OverridepublicvoidaddPart(Schoolschool){}@OverridepublicvoidremovePart(Schoolschool){}@OverridepublicvoiddisplayPart(){System.out.println("我是"+name+",负责学校安全");}}最后,写测试类如下:publicclassCompositeClient{publicstaticvoidmain(String[]args){//ConcreteSchoolrootSchool=newConcreteSchool("主校");rootSchool.addPart(newInternetDepartment("主校互联网系"));rootSchool.addPart(newSecurityDepartment("主校保卫部"));//分校部ConcreteSchoolbranchSchool=newConcreteSchool("分校部");branchSchool.addPart(newInternetDepartment("分校部网络部"));branchSchool.addPart(newSecurityDepartment("分校部保卫部")));rootSchool.addPart(branchSchool);rootSchool.displayPart();//显示信息}}输出结果:我是总校网络部,负责学校网络管理我是学校安全部e校长,负责学校的安全工作我是分校的网络部,负责学校的网络管理我是分校的保卫部,负责学校的保卫工作从上面的例子,我们可以很清楚的看出层次关系类,以及所有具体的对象都作为一个单独的对象处理学派处理3.应用于JavaGUI容器组件时,采用组合模式,所有的子类组件都可以看作是容器对象。当然,Mybatis在处理动态SQL节点时也采用了组合设计模式。Mybatis会将映射配置文件中定义的动态SQL节点和文本节点解析成对应的SqlNode实现,形成树状结构。4.总结当要表达对象的部分-整体层次结构时,建议使用组合方式进行设计。五、参考1.Java架构师技术栈-23种设计模式的组合模式2.菜鸟教程-组合模式