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

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

总结

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

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript设计模式 – 组合模式原理与应用实例分析 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • SpringBoot 实现自定义的 @ConditionalOnXXX 注解示例详解

    SpringBoot 实现自定义的 @ConditionalOnXXX 注解示例详解 在 Spring Boot 应用程序中,我们可以使用 @ConditionalOnXXX 注解来控制自动配置是否生效。例如,@ConditionalOnClass 注解可以在 classpath 中存在指定的类时生效,@ConditionalOnMissingBean 注解…

    Java 2023年5月15日
    00
  • 详解servlet调用的几种简单方式总结

    接下来我会详细讲解“详解servlet调用的几种简单方式总结”的完整攻略。 一、概述 在Java Web开发中,Servlet是一个非常重要的组件。在使用Servlet时,我们需要调用Servlet,以便它可以响应客户端的请求。本文将简要介绍Servlet的使用,并总结几种简单的调用方式。 二、Servlet的使用示例 首先我们需要新建一个Servlet,下…

    Java 2023年6月15日
    00
  • Java实现将数字日期翻译成英文单词的工具类实例

    Java实现将数字日期翻译成英文单词的工具类实例,可以帮助我们将数字日期转换成更易于阅读和理解的英文单词格式。下面我来详细讲解该实现的完整攻略: 1. 准备工作 首先,我们需要创建一个Java工程,将代码存放在该工程中。在工程中创建一个名为DateUtil的工具类,用于实现数字日期翻译成英文单词的功能。 2. 定义工具类 在DateUtil工具类中,我们需要…

    Java 2023年5月19日
    00
  • Java 装箱与拆箱详解及实例代码

    Java 装箱与拆箱详解及实例代码 什么是装箱与拆箱 在Java中,基本的数据类型包括byte, short, int, long, float, double, char, boolean等。而Java中还有一种引用类型,例如String、Scanner等。在此基础上,Java还增加了一种特殊的包装类型,它们分别是Byte, Short, Integer,…

    Java 2023年5月23日
    00
  • Java C++ 题解leetcode857雇佣K名工人最低成本vector pair

    题目描述: 给定两个长度为N的整数数组,W数组表示每个工人的工资,Q数组表示每个工人完成工作的质量。现在要雇佣K名工人去完成一些工作,每个工人只能完成一项工作,工人完成一项工作的质量就是该工作质量的总和,而这些工作的总成本是所有工人的工资总和。求最小的总成本。 思路分析: 先将工资按比例排序,使用最小堆,维护当前最小的K个工资,同时记录下当前最小K个工资的序…

    Java 2023年5月20日
    00
  • SpringMVC项目异常处理机制详解

    在 SpringMVC 项目中,异常处理是非常重要的一部分。如果不正确地处理异常,可能会导致应用程序崩溃或者出现安全漏洞。本文将详细讲解 SpringMVC 项目异常处理机制,包括异常处理器的编写、异常处理流程、异常处理方式等。 编写异常处理器 在 SpringMVC 项目中,我们可以通过编写异常处理器来处理异常。异常处理器是一个类,它实现了 Spring …

    Java 2023年5月18日
    00
  • AngularJS HTML编译器介绍

    AngularJS HTML编译器是AngularJS的核心模块之一,用于将HTML模板编译成可操作的JavaScript对象,并连接到作用域上。在本文中,我们将详细讲解AngularJS HTML编译器的使用和原理,并结合示例进行说明。 一、AngularJS HTML编译器介绍 1.1 HTML编译器的作用 AngularJS的HTML编译器主要作用是将…

    Java 2023年6月15日
    00
  • spring security CSRF防护的示例代码

    下面我将为你详细讲解如何实现spring security CSRF防护的示例代码。 一、使用spring security实现CSRF防护的原理 Spring Security主要通过以下两种方式实现CSRF防护: CSRF Token 在用户登录后,在服务器端生成一个Token,将该Token发送给前端页面。在前端页面的每一个提交操作中,都需要将这个To…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部