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

2023-12-10java编程
4

下面是本文“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();

总结

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

The End

相关推荐

一文带你掌握Java8中Lambda表达式 函数式接口及方法构造器数组的引用
Lambda表达式是Java 8中引入的新特性之一,它是一个匿名函数,可以捕获参数并表现为一个代码块,而不像方法一样需要一个固定的名称。它主要用于传递行为或代码块以及事件处理等操作。...
2023-12-11 java编程
30

基于Java 谈回调函数
下面为您详细讲解基于Java的回调函数。...
2023-12-11 java编程
21

java equals函数用法详解
在Java中,equals()是用来比较两个对象是否相等的函数。equals()方法是Object类中的方法,因此所有Java类都包含equals()方法。在默认情况下,equals()方法比较对象的引用地址是否相同,即两个对象是否是同一个实例。但是,我们可以覆盖equals()方法,来定义自...
2023-12-11 java编程
63

JavaWeb学习笔记分享(必看篇)
JavaWeb是Java在Web领域的应用,是目前非常热门的技术之一。但是JavaWeb涉及到的技术非常广泛,初学者很容易迷失方向。本文总结了JavaWeb的基础知识,为初学者提供了一份学习笔记分享,希望能够帮助大家快速入门。...
2023-12-11 java编程
8

Java中replace、replaceAll和replaceFirst函数的用法小结
在Java编程中,字符串操作是很常见的,而替换字符串是其中常用的操作之一。Java提供了三种函数用于替换字符串:replace、replaceAll和replaceFirst。这篇文章将为您详细介绍它们的用法。...
2023-12-11 java编程
121

基于Java中进制的转换函数详解
进制是数学中一种表示数值大小的方法,常见的进制有10进制、2进制、16进制等。...
2023-12-11 java编程
45