您现在的位置是:亿华云 > 域名
深度解析设计模式之组合模式
亿华云2025-10-04 03:23:45【域名】8人已围观
简介一、介绍组合模式(Composite Pattern),又叫部分整体模式,依据树形结构来组合对象,用来表示部分以及整体层次。组合模式 一般用来描述整体与部分的关系,它将对象组织到树形结构中,最顶层的节
一、深度设计式介绍
组合模式(Composite Pattern),解析又叫部分整体模式,模式依据树形结构来组合对象,合模用来表示部分以及整体层次。深度设计式
组合模式 一般用来描述整体与部分的解析关系,它将对象组织到树形结构中,模式最顶层的合模节点称为根节点,根节点下面可以包含树枝节点和叶子节点,深度设计式树枝节点下面又可以包含树枝节点和叶子节点。解析如下图所示:
在组合模式中,模式会把树枝节点和叶子节点认为是合模同一种数据类型(用同一接口定义),让它们具备一致行为。深度设计式
这样,解析整个树形结构中的模式对象都是同一种类型,带来的一个好处就是客户无需辨别 树枝节点还是叶子节点,而是可以直接进行操作,给客户使用带来极大的便利。
从设计的角度看,组合模式涉及到三个角色:
抽象根节点:它是一个抽象接口,定义了算法;
具体节点:实现或继承自抽象根节点,完成具体算法操作;
客户端:客户类提出使用具体类的网站模板请求;
二、示例
下面,我们拿学校的组织架构为例,比如说一个学校,包含了后勤部、网络部、教学部、保卫部、分校等部门组成,每一个分校,同样具有后勤部、网络部这些。既然这些部门都是学校的部门,基本的操作应该都是一样的,我们可以将所有的部门都拉入学校属性。
用类图表示如下:
实现过程如下!
/** * 学校接口 */ public interface School { /** * 添加分校或者部门 * @param school */ void addPart(School school); /** * 移除分校或者部门 * @param school */ void removePart(School school); /** * 展示分校或者部门信息 */ void displayPart(); }然后,创建一个学校具体实现类ConcreteSchool,可以是总校,也可以是分校,如下:
/** * 具体学校,可以是总校,也可以是分校 */ public class ConcreteSchool implements School { private String name;//名称 private List<School> partList = new ArrayList<>(); public ConcreteSchool(String name) { this.name = name; } @Override public void addPart(School school) { partList.add(school); } @Override public void removePart(School school) { partList.remove(school); } /** * 学校查看部门信息 */ @Override public void displayPart() { for (School school : partList) { school.displayPart(); } } }接着,亿华云创建两个具体的部门,网络部门InternetDepartment、安全部门SecurityDepartment,代码如下:
/** * 网络部门 */ public class InternetDepartment implements School { private String name;//名称 public InternetDepartment(String name) { this.name = name; } @Override public void addPart(School school) { } @Override public void removePart(School school) { } @Override public void displayPart() { System.out.println("我是" + name + ",负责学校的网络管理"); } } /** * 安全部门 */ public class SecurityDepartment implements School { private String name;//名称 public SecurityDepartment(String name) { this.name = name; } @Override public void addPart(School school) { } @Override public void removePart(School school) { } @Override public void displayPart() { System.out.println("我是" + name + ",负责学校的安全工作"); } }最后,编写一个测试类,如下:
public class CompositeClient { public static void main(String[] args) { //总校部门 ConcreteSchool rootSchool = new ConcreteSchool("总校"); rootSchool.addPart(new InternetDepartment("总校网络部门")); rootSchool.addPart(new SecurityDepartment("总校安全部门")); //分校部门 ConcreteSchool branchSchool = new ConcreteSchool("分校"); branchSchool.addPart(new InternetDepartment("分校网络部门")); branchSchool.addPart(new SecurityDepartment("分校安全部门")); rootSchool.addPart(branchSchool); rootSchool.displayPart();//展示信息 } }输出结果:
我是总校网络部门,负责学校的网络管理 我是总校安全部门,负责学校的安全工作 我是分校网络部门,负责学校的网络管理 我是分校安全部门,负责学校的安全工作从上面的例子,可以很清晰看到类的层次关系,所有的具体对象当作一个单一的对象School来处理。
三、应用
在 Java 的云南idc服务商 GUI 容器组件中,就用到了组合模式,所有的子类组件,都可以看作为容器对象。
当然,还有我们使用的 Mybatis 在处理动态 SQL 节点时,也应用到了组合设计模式,Mybatis 会将映射配置文件中定义的动态 SQL 节点、文本节点等解析成对应的 SqlNode 实现,并形成树形结构。
四、总结
当想表达对象的部分-整体的层次结构时,推荐采用组合模式进行设计。
五、参考
1、java的架构师技术栈 - 23种设计模式之组合模式
2、菜鸟教程 -组合模式
很赞哦!(43)
相关文章
- .com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
- 用 C 语言理解 Linux 软件库
- Swift 中如何进行多重条件排序
- Facebook 如何避免大规模线上故障
- 域名和网址一样吗?域名和网址有什么区别?
- 【性能优化】性能测量工具-Chrome DevTools Performance
- 前端百题斩之Js中6种变量声明方式
- Python 的 Generator 和 Go 的 Concurrency Pattern
- 在更换域名后,并不是就万事大吉了,我们需要将旧域名做301重定向到新域名上,转移旧域名的权重到新域名上。
- 用Python绘制棒棒糖图表,真的好看!