JavaScript作曲家

本文的翻译是在“ JavaScript开发人员”课程开始时准备的基本的








在本文中,我们将分解JavaScript中的一种结构设计模式-链接器。在软件工程中,链接器使您可以引用对象组,就好像它们是单独的对象一样,从而确保这些对象及其组合的整体结构一致。



链接器的主要任务是许多对象组合成一个树结构。该树结构表示从特定到整体层次结构



为了更好地了解链接器的工作原理,您需要了解从具体到整个工作的层次结构以及如何对其进行可视化。



在从特定到整体的层次结构中,集合中的每个对象都是整体结构的一部分。反过来,这种总体组成是其各个部分的集合从特定到整体的层次结构构建为树状结构,其中每个单独的“叶”或“节点”的感知和处理方式与树中任何部分的任何其他叶或节点相同。因此,对象的组或集合(工作表/节点的子树)也是叶子或节点。



在视觉上,它可以表示为以下内容:







现在,我们对私有和整体之间的关系有了更清晰的了解,让我们回到术语链接器... 我们定义了链接器的用途是根据该原理提到的对象(叶/节点)组合到树中。



因此,我们获得了一种设计模式,其中集合的每个元素还可以包括其他集合,从而允许深度嵌套的结构。



内部结构



树中的每个节点共享一组公共的属性和方法,使它们能够以与对象集合相同的方式来维护单个对象并与之交互。该接口假定构造递归算法,该递归算法遍历复合集合中的所有对象。



这种模式在哪里适用?



在操作系统上,此模式允许许多可能性,例如在目录中创建目录。



文件(为方便起见,目录中的所有对象都可以视为“元素”)是整个组合(目录)中的叶子/节点(部分)。在目录中创建的子目录类似地是包含其他元素(例如视频,图像等)的叶或节点。同时,目录和子目录也是复合的,因为它们是不同部分(对象,文件等)的集合。等等。)。



诸如React或Vue之类的流行库广泛使用此模式来构建可靠,可重用的接口。您看到的网页的所有元素都表示为组件网页的每个组件都是一棵树的叶子,它本身可以组合许多组件(在这种情况下,形成了一个复合体,但它仍然是一棵树的叶子)。它是一个功能强大的工具,可大大简化图书馆用户的开发。此外,它还允许您创建涉及多个对象的可伸缩应用程序。



为什么这个模板有趣?



简而言之:它非常强大。



链接器是一种功能强大的设计模式,因为它允许通过对所有对象使用通用接口将对象视为复合对象。



这意味着您可以重用对象而不必担心与其他对象不兼容。



在开发应用程序时,您可能需要使用具有树形结构的对象,在这种情况下,使用此模式可能非常有效。



示例



假设我们正在为一家公司开发应用程序,以帮助医生获得可远程提供医疗保健服务的平台的认证。该过程包括收集法定文件的签名。



我们Document将使用一个signature具有默认值为false的属性的类如果医生在文件上签名,则签名值将更改为他的签名。我们还在此类中定义一个方法sign来实现此功能。



它将是这样的Document



class Document {
  constructor(title) {
    this.title = title
    this.signature = null
  }
  sign(signature) {
    this.signature = signature
  }
}




现在,使用链接器,我们将为与中定义的方法相似的方法提供支持Document



class DocumentComposite {
  constructor(title) {
    this.items = []
    if (title) {
      this.items.push(new Document(title))
    }
  }

  add(item) {
    this.items.push(item)
  }

  sign(signature) {
    this.items.forEach((doc) => {
      doc.sign(signature)
    })
  }
}


现在,模板的优美之处变得明显了。请注意最后两个代码段:让我们直观地看一下模板:



太好了!看来我们走在正确的轨道上。我们得到的与上述方案相对应。







因此,我们的树结构包含两个叶子/节点-DocumentDocumentComposite。它们共享相同的接口,因此充当单个复合树的“部分” 在此应注意,不是composite(的叶/树节点不是对象集合或组,因此不会继续分支。但是,叶/节点



Document复合材料,包含零件的集合(在我们的例子中是items)。还要记住,Document它们都DocumentComposite共享一个公共接口,因此也共享sign方法。



那么这种方法的效果如何?尽管DocumentComposite使用诸如Document之类的符号方法来使用单个接口,但是它在实现最终目标的同时采用了更有效的方法。



因此,而不是像这样的结构:



const pr2Form = new Document(
  'Primary Treating Physicians Progress Report (PR2)',
)
const w2Form = new Document('   (W2)')

const forms = []
forms.push(pr2Form)
forms.push(w2Form)

forms.forEach((form) => {
  form.sign('Bobby Lopez')
})


我们可以利用链接器来修改代码并使之更有效:



const forms = new DocumentComposite()
const pr2Form = new Document(
  '     (PR2)',
)
const w2Form = new Document('   (W2)')
forms.add(pr2Form)
forms.add(w2Form)

forms.sign(' ')

console.log(forms)


使用这种方法,我们只需要在添加所有必要文档后执行一次签名,此功能便可以对所有文档进行签名。



您可以通过查看函数的输出来验证这一点 console.log(forms)







在前面的示例中,我们必须手动将文档添加到数组,然后独立地遍历每个文档并执行函数sign以对其进行签名。



另外,请不要忘记我们DocumentComposite的文件可能包含文件的集合。



因此,当我们这样做时:



forms.add(pr2Form) // 
forms.add(w2Form) // 


我们的方案采用以下形式:







我们添加了两种形式,现在该方案几乎与原始方案完全相同:





尽管如此,我们的树停止了生长,因为它的最后一片叶子仅形成了两片叶子,这与最后一个屏幕截图中的图不太对应。如果相反,我们将w2form制成复合材料,如下所示:



const forms = new DocumentComposite()
const pr2Form = new Document(
  '     (PR2)',
)
const w2Form = new DocumentComposite('   (W2)')
forms.add(pr2Form)
forms.add(w2Form)

forms.sign(' ')

console.log(forms)


然后我们的树可以继续生长:





最终,我们将实现相同的目标-所有文件都将被签名:





这是链接器进入的地方。



结论



目前为止就这样了!希望这些信息对您有所帮助。更进一步!



媒体上找到我







阅读更多:






All Articles