<legend id='xEaeN'><style id='xEaeN'><dir id='xEaeN'><q id='xEaeN'></q></dir></style></legend>
    • <bdo id='xEaeN'></bdo><ul id='xEaeN'></ul>

  1. <tfoot id='xEaeN'></tfoot>

      <small id='xEaeN'></small><noframes id='xEaeN'>

      <i id='xEaeN'><tr id='xEaeN'><dt id='xEaeN'><q id='xEaeN'><span id='xEaeN'><b id='xEaeN'><form id='xEaeN'><ins id='xEaeN'></ins><ul id='xEaeN'></ul><sub id='xEaeN'></sub></form><legend id='xEaeN'></legend><bdo id='xEaeN'><pre id='xEaeN'><center id='xEaeN'></center></pre></bdo></b><th id='xEaeN'></th></span></q></dt></tr></i><div id='xEaeN'><tfoot id='xEaeN'></tfoot><dl id='xEaeN'><fieldset id='xEaeN'></fieldset></dl></div>

    1. javascript设计模式 – 组合模式原理与应用实例分析

      时间:2023-12-10

      <small id='NECdL'></small><noframes id='NECdL'>

      <i id='NECdL'><tr id='NECdL'><dt id='NECdL'><q id='NECdL'><span id='NECdL'><b id='NECdL'><form id='NECdL'><ins id='NECdL'></ins><ul id='NECdL'></ul><sub id='NECdL'></sub></form><legend id='NECdL'></legend><bdo id='NECdL'><pre id='NECdL'><center id='NECdL'></center></pre></bdo></b><th id='NECdL'></th></span></q></dt></tr></i><div id='NECdL'><tfoot id='NECdL'></tfoot><dl id='NECdL'><fieldset id='NECdL'></fieldset></dl></div>
          • <bdo id='NECdL'></bdo><ul id='NECdL'></ul>
              <tbody id='NECdL'></tbody>

          • <tfoot id='NECdL'></tfoot>

                <legend id='NECdL'><style id='NECdL'><dir id='NECdL'><q id='NECdL'></q></dir></style></legend>

                下面是本文“javascript设计模式 – 组合模式原理与应用实例分析”的完整攻略。

                概述

                组合模式是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,用户无需关心所使用对象的具体类型,只需要关心对象之间的层次关系。

                模式结构

                组合模式包含以下角色:
                - Component(抽象构件):定义组合中子对象的通用接口。
                - Leaf(叶子节点):表示组合中的单个对象,没有子节点。
                - Composite(组合节点):表示组合中的复合对象,可以添加和删除子节点。

                实例分析

                利用组合模式,我们可以将树形结构中的节点和叶子看做是组合模式中的‘组合节点’和‘叶子节点’,然后通过不断的将叶子作为节点的子节点来形成树形结构。

                示例一

                实现一个包含文件和目录的树形结构,在用户选择目录时可以自动选中该目录下所有的文件和文件夹。

                class File {
                  constructor(name) {
                    this.name = name;
                  }
                  getSelectedFiles() {
                    return [this];
                  }
                }
                
                class Directory {
                  constructor(name) {
                    this.name = name;
                    this.files = [];
                  }
                  add(file) {
                    this.files.push(file);
                  }
                  remove(file) {
                    const index = this.files.indexOf(file);
                    this.files.splice(index, 1);
                  }
                  getSelectedFiles() {
                    let result = [];
                    for (let file of this.files) {
                      result = result.concat(file.getSelectedFiles());
                    }
                    return result;
                  }
                }
                
                // Usage:
                const root = new Directory('root');
                const dir1 = new Directory('dir1');
                const dir2 = new Directory('dir2');
                const file1 = new File('file1');
                const file2 = new File('file2');
                const file3 = new File('file3');
                
                dir1.add(file1);
                dir1.add(file2);
                dir2.add(file3);
                root.add(dir1);
                root.add(dir2);
                
                // Select the root directory and log all selected files
                const selectedFiles = root.getSelectedFiles();
                console.log(selectedFiles);
                

                示例二

                实现一个简单的菜单组件,在菜单中可以包含子菜单或者菜单项。

                class MenuItem {
                  constructor(name, action) {
                    this.name = name;
                    this.action = action;
                  }
                  doAction() {
                    this.action();
                  }
                }
                
                class Menu {
                  constructor(name) {
                    this.name = name;
                    this.menuItems = [];
                  }
                  add(menuItem) {
                    this.menuItems.push(menuItem);
                  }
                  remove(menuItem) {
                    const index = this.menuItems.indexOf(menuItem);
                    this.menuItems.splice(index, 1);
                  }
                  display() {
                    console.log(this.name);
                    for (let menuItem of this.menuItems) {
                      console.log(menuItem.name);
                    }
                  }
                }
                
                // Usage:
                const saveAction = () => console.log('Saving document');
                const exitAction = () => console.log('Exiting application');
                
                const menu = new Menu('File');
                const menuItem1 = new MenuItem('Save', saveAction);
                const menuItem2 = new MenuItem('Exit', exitAction);
                
                menu.add(menuItem1);
                menu.add(menuItem2);
                
                const subMenu = new Menu('Export');
                const subMenuItem1 = new MenuItem('PDF', () => console.log('Exporting PDF'));
                const subMenuItem2 = new MenuItem('DOC', () => console.log('Exporting DOC'));
                
                subMenu.add(subMenuItem1);
                subMenu.add(subMenuItem2);
                
                menu.add(subMenu);
                
                menu.display();
                
                // Select the Exit menu item
                menuItem2.doAction();
                

                总结

                组合模式是一种简单但非常有效的模式,使我们能够构建具有“部分-整体”层次结构的对象。组合模式提高了代码逻辑的清晰度,简化了代码维护,也使得我们的代码更加灵活和可扩展。

                上一篇:一个低学历者的辛酸程序路[贵在坚持] 下一篇:java中的取整与四舍五入方法实例

                相关文章

                <i id='wO3wT'><tr id='wO3wT'><dt id='wO3wT'><q id='wO3wT'><span id='wO3wT'><b id='wO3wT'><form id='wO3wT'><ins id='wO3wT'></ins><ul id='wO3wT'></ul><sub id='wO3wT'></sub></form><legend id='wO3wT'></legend><bdo id='wO3wT'><pre id='wO3wT'><center id='wO3wT'></center></pre></bdo></b><th id='wO3wT'></th></span></q></dt></tr></i><div id='wO3wT'><tfoot id='wO3wT'></tfoot><dl id='wO3wT'><fieldset id='wO3wT'></fieldset></dl></div>

                    <bdo id='wO3wT'></bdo><ul id='wO3wT'></ul>
                1. <small id='wO3wT'></small><noframes id='wO3wT'>

                2. <legend id='wO3wT'><style id='wO3wT'><dir id='wO3wT'><q id='wO3wT'></q></dir></style></legend>
                    <tfoot id='wO3wT'></tfoot>