js设计模式——组合模式

组合模式用于构建对象的树形结构,表达部分与整体的关系,通过多态性简化对单个对象和组合对象的处理。在文件系统中,文件夹和文件是典型的应用场景,文件夹可以包含文件和其他文件夹。组合模式强调对象的一致性接口,而非继承关系。当结构复杂时,职责链模式可提升性能,通过对象间的链式传递处理请求。
摘要由CSDN通过智能技术生成

组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,是的用户对单个对象和组合对象的使用具有一致性。

一、组合模式特点:

  • 表示属性结构。组合模式可以非常方便地描述对象部分-整体层次结构。
  • 利用对象多态性统一对待组合对象和单个对象。在组合模式中,客户将统一地使用组合结构中的所有对象,而无需关心它究竟是组合对象还是单个对象。

二、注意的事项

  1. 组合模式不是父子关系。

组合模式是一种 HAS-A(聚合)的关系,而不是 IS-A。组合对象包括一组叶对象,但叶对象不是组合对象的子类。组合对象把请求委托给它包含的所有叶对象,它们能够合作的关键是拥有相同的接口。

  1. 对叶对象操作的一致性。

组合模式除了要求组合对象和叶对象拥有相同的接口之外,还有一个必要条件,就是对一组叶对象的操作必须具有一致性。

  1. 用职责链模式提高组合模式性能。

在合租模式中,如果树的结构比较复杂,节点数量很多,在遍历树的过程中,性能方面也许表现得不够理想。有时候我们确实可以借助一些技巧,在实际操作中避免遍历整棵树,有一种线程得方案是借助 职责链模式职责链模式一般需要我们手动去设置链条,但在组合模式中,父对象和子对象之间实际上形成了天然得职责链。让请求顺着链条从父对象往子对象传递,或者是反过来从子对象往父对象传递,直到遇到可以处理该请求得对象为止,这也是职责链模式得经典运用场景之一。

三、何时使用组合模式

组合模式适用于以下这两种情况:

  1. 表示对象的部分-整体层次接口。
  2. 客户希望统一对待树中的所有对象。

四、例子

1.扫描文件夹

文件夹和文件之间的关系,非常适合用组合模式来描述。文件夹里既可以包含文件,又可以包含其他文件夹,最终可能组合成一棵树。

const Folder = function(name) {
  this.name = name
  this.files = []
}

Folder.prototype.add = function(file) {
  this.files.push(file)
}

Folder.prototype.scan = function() {
  console.log('开始扫描文件夹:' + this.name)
  for( let i = 0, file, files = this.files; file = files[i++];) {
    file.scan()
  }
}

const File = function(name) {
  this.name = name
}

File.prototype.add = function() {
  throw new Error('文件下面不能再添加文件')
}

File.prototype.scan = function() {
  console.log('开始扫描文件:' + this.name)
}
const folder = new Folder('学习资料')
const folder1 = new Folder('JavaScript')
const folder2 = new Folder('jQuery')

const file1 = new File('JavaScript 设计模式与开发实践')
const file2 = new File('精通 jQuery')
const file3 = new File('重构与模式')

folder1.add(file1)
folder2.add(file2)

folder.add(folder1)
folder.add(folder2)
folder.add(file3)

const folder3 = new Folder('Nodejs')
const file4 = new File('深入浅出 Node.js')
folder3.add(file4)

const file5 = new File('JavaScript 语言精粹与编程实践')
folder.add(folder3)
folder.add(file5)


folder.scan()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值