你所在的位置: 首页 > 正文

JavaScript 设计模式(八):组合模式

2019-08-17 点击:1881

7324444-4626f163b16c66cc.jpg

组合模式

组合模式:也称为“部分整体”模式,将对象组合成树结构以表示“部分总体”层次结构。通过对象的多态性,用户对单个对象和组合对象的使用是一致的。

Life Little Chestnut:文件目录,DOM文档树

表示生成“叶型”结构的“部分总体”层次结构;

一致的可操作性,叶对象与外部接口一致(操作与数据结构一致);

自上而下的请求流,从树对象传递到叶对象;

调用顶级对象将遍历其叶对象执行。

7324444-b5320d2d0ff07c7b.png

叶子结构

树对象和叶对象接口是统一的,树对象添加了一个缓存数组来存储叶对象。执行树对象方法时,请求将传递给其下层叶对象执行。

与界面一致。执行时,如果发现它是树对象,继续遍历它下面的叶对象并执行它。

JavaScript与其他静态编程语言不同。实现组合模式的困难在于保持树对象和叶对象之间的接口均匀。您可以使用TypeScript自定义接口规范以实现类型约束。

组合模式的透明度意味着叶对象接口保持一致,并且不需要区分外部调用。但是,这会带来一些问题。例如,在上面的文件目录示例中,无法在文件(叶对象)下添加文件,因此需要在文件类的方法中抛出异常作为提醒。

1.组合不是继承,叶对象不是父对象或子对象

复合模式的树结构是HAS-A(聚合)的关系,而不是IS-A。叶对象合作的关键是它们与外界保持统一的接口,而不是叶对象继承的树对象的属性方法,它们之间的关系不是父子。

2.叶对象操作保持一致

除了叶对象与树对象接口的一致性之外,操作还必须是一致的。一片叶子只能在一棵树上生长。调用顶级对象时,每个叶对象只能接收一次请求,而叶对象不能属于多个树对象。

3.通过叶子对象实现气泡传输

请求传递从树到叶传递。如果要反转传输过程,则需要在叶对象中保留对树对象的引用,并将气泡传递给树对象进行处理。

4.不仅仅是简单的子集遍历

在调用对象的接口方法时,如果对象是树对象,则将请求传递给执行方法的叶对象,依此类推。与迭代器模式不同,迭代器模式遍历不执行请求传导。

优化递归或分层数据结构的处理(文件系统目录文件管理);

结合其他设计模式,如命令模式,实现“宏命令”。

优点:

忽略复合对象和单个对象之间的差异,并使用外部一致性接口。

解耦调用者和复杂元素之间的关系使处理更容易。

缺点

叶对象接口是相同的,无法区分,只能在运行时识别。

创建了太多的包装对象,这增加了额外的内存负担。

参考文章

《JavaScript 设计模式与开发实践》

本文从Github开始,期待Star!

作者:以幸福的名义

这篇文章是原创的,有不合适的地方欢迎。请说明来源。

日期归档
老葡京平台 版权所有© www.chinaskool.com 技术支持:老葡京平台 | 网站地图