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日

相关文章

  • SpringMvc直接接收json数据自动转化为Map的实例

    讲解SpringMvc直接接收json数据自动转化为Map的实例的完整攻略如下: 1. 添加相关依赖 首先,我们需要添加SpringMvc相关的依赖。在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework</groupId> <artifactId&g…

    Java 2023年5月26日
    00
  • ssi框架学习总结(mvc三层架构)

    我来分享一下“SSI框架学习总结(MVC三层架构)”的完整攻略,希望对你有所帮助。 什么是SSI框架 SSI (Server Side Include),即服务器端包含,它是一种通过服务器端处理动态内容的技术。SSI框架是一种基于MVC(Model-View-Controller)的三层架构,主要由数据层、业务层和表示层组成。其中,数据层负责数据存储和数据访…

    Java 2023年5月20日
    00
  • Form表单上传文件(type=”file”)的使用

    下面是关于“Form表单上传文件(type=”file”)的使用”的完整攻略。 什么是表单上传文件 表单上传文件是指通过HTML表单允许用户上传文件。它使用表单元素的type属性设置为“file”,可以让用户选择一个或多个文件。 表单上传文件的实现步骤 要使用表单上传文件,需要以下步骤: 在HTML页面中创建一个表单元素,并将其类型设置为“post”,同时指…

    Java 2023年6月15日
    00
  • SpringBoot常用数据库开发技术汇总介绍

    下面我来详细讲解一下“SpringBoot常用数据库开发技术汇总介绍”的完整攻略: SpringBoot常用数据库开发技术汇总介绍 1. 数据库选择 Spring Boot 支持与多种数据库进行集成,包括但不限于 MySQL、PostgreSQL、Oracle、DB2、SQL Server、MongoDB 等。我们可以选择适合自己需求的数据库进行开发。 2.…

    Java 2023年5月15日
    00
  • PHP.vs.JAVA

    PHP vs. JAVA 完整攻略 简介 PHP和JAVA都是目前广泛使用的编程语言。它们在某些方面相似,但在其他方面则有很大的不同。这篇文章将讨论PHP和JAVA的区别以及它们各自的优势和缺点。 语法 PHP是一种动态类型语言,不需要声明变量的类型。例如: “`php “` JAVA是一种静态类型语言,每个变量在声明时必须指定它的类型。例如: java…

    Java 2023年6月15日
    00
  • JS获取计算机mac地址以及IP的实现方法

    获取计算机的MAC地址和IP地址,可以使用JavaScript来实现。不过需要注意的是,这些信息只能从请求发起的客户端获取,而无法从服务器端获取。下面是具体的实现方法: 获取IP地址 获取IP地址的方法比较简单,可以通过访问某些特定的网站来获取。常用的方法是使用httpbin.org提供的IP地址查询API。具体步骤如下: 构造一个GET请求,访问”http…

    Java 2023年6月15日
    00
  • SpringBoot整合Apache Pulsar教程示例

    SpringBoot整合Apache Pulsar教程示例 本教程将介绍如何使用SpringBoot框架和Apache Pulsar进行消息队列的集成,我们将使用两个不同的示例进行演示,以展示如何将消息发送到Pulsar,并如何从Pulsar中接收消息。 示例1: 发送消息到Pulsar 我们首先来看如何使用SpringBoot和Pulsar在代码中发送消息…

    Java 2023年5月20日
    00
  • Java switch 语句如何使用 String 参数

    Java中的switch语句通常用于针对不同的情况执行不同的操作,常用于替代多个if-else语句的情况。在早期版本中,switch语句只支持整数和枚举类型的参数,但从Java 7版本开始,可以使用字符串参数。下面详细描述如何在Java switch语句中使用字符串参数: 1. switch语句如何使用String类型的参数 为了使用字符串参数,可以在Jav…

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