广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >JavaScript组合模式的简单介绍
  • 823
分享到

JavaScript组合模式的简单介绍

2024-04-02 19:04:59 823人浏览 泡泡鱼
摘要

这篇文章主要介绍“javascript组合模式的简单介绍”,在日常操作中,相信很多人在JavaScript组合模式的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja

这篇文章主要介绍“javascript组合模式的简单介绍”,在日常操作中,相信很多人在JavaScript组合模式的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript组合模式的简单介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

介  绍

组合模式(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

常见的场景有asp.net里的控件机制(即control里可以包含子control,可以递归操作、添加、删除子control),类似的还有DOM的机制,一个DOM节点可以包含子节点,不管是父节点还是子节点都有添加、删除、遍历子节点的通用功能。所以说组合模式的关键是要有一个抽象类,它既可以表示子元素,又可以表示父元素。

正  文

举个例子,有家餐厅提供了各种各样的菜品,每个餐桌都有一本菜单,菜单上列出了该餐厅所偶的菜品,有早餐糕点、午餐、晚餐等等,每个餐都有各种各样的菜单项,假设不管是菜单项还是整个菜单都应该是可以打印的,而且可以添加子项,比如午餐可以添加新菜品,而菜单项咖啡也可以添加糖啊什么的。

这种情况,我们就可以利用组合的方式将这些内容表示为层次结构了。我们来逐一分解一下我们的实现步骤。

***步,先实现我们的“抽象类”函数MenuComponent:

var MenuComponent = function () {  };  MenuComponent.prototype.getName = function () {      throw new Error("该方法必须重写!");  };  MenuComponent.prototype.getDescription = function () {      throw new Error("该方法必须重写!");  };  MenuComponent.prototype.getPrice = function () {      throw new Error("该方法必须重写!");  };  MenuComponent.prototype.isVegetarian = function () {      throw new Error("该方法必须重写!");  };  MenuComponent.prototype.print = function () {      throw new Error("该方法必须重写!");  };  MenuComponent.prototype.add = function () {      throw new Error("该方法必须重写!");  };  MenuComponent.prototype.remove = function () {      throw new Error("该方法必须重写!");  };  MenuComponent.prototype.getChild = function () {      throw new Error("该方法必须重写!");  };

该函数提供了2种类型的方法,一种是获取信息的,比如价格,名称等,另外一种是通用操作方法,比如打印、添加、删除、获取子菜单。

第二步,创建基本的菜品项:

var MenuItem = function (sName, sDescription, bVegetarian, nPrice) {      MenuComponent.apply(this);      this.sName = sName;      this.sDescription = sDescription;      this.bVegetarian = bVegetarian;      this.nPrice = nPrice;  };  MenuItem.prototype = new MenuComponent();  MenuItem.prototype.getName = function () {      return this.sName;  };  MenuItem.prototype.getDescription = function () {      return this.sDescription;  };  MenuItem.prototype.getPrice = function () {      return this.nPrice;  };  MenuItem.prototype.isVegetarian = function () {      return this.bVegetarian;  };  MenuItem.prototype.print = function () {      console.log(this.getName() + ": " + this.getDescription() + ", " + this.getPrice() + "euros");  };

由代码可以看出,我们只重新了原型的4个获取信息的方法和print方法,没有重载其它3个操作方法,因为基本菜品不包含添加、删除、获取子菜品的方式。

第三步,创建菜品:

var Menu = function (sName, sDescription) {      MenuComponent.apply(this);      this.aMenuComponents = [];      this.sName = sName;      this.sDescription = sDescription;      this.createIterator = function () {          throw new Error("This method must be overwritten!");      };  };  Menu.prototype = new MenuComponent();  Menu.prototype.add = function (oMenuComponent) {      // 添加子菜品      this.aMenuComponents.push(oMenuComponent);  };  Menu.prototype.remove = function (oMenuComponent) {      // 删除子菜品      var aMenuItems = [];      var nMenuItem = 0;      var nLenMenuItems = this.aMenuComponents.length;      var oItem = null;       for (; nMenuItem < nLenMenuItems; ) {          oItem = this.aMenuComponents[nMenuItem];          if (oItem !== oMenuComponent) {              aMenuItems.push(oItem);          }          nMenuItem = nMenuItem + 1;      }      this.aMenuComponents = aMenuItems;  };  Menu.prototype.getChild = function (nIndex) {      //获取指定的子菜品      return this.aMenuComponents[nIndex];  };  Menu.prototype.getName = function () {      return this.sName;  };  Menu.prototype.getDescription = function () {      return this.sDescription;  };  Menu.prototype.print = function () {      // 打印当前菜品以及所有的子菜品      console.log(this.getName() + ": " + this.getDescription());      console.log("--------------------------------------------");       var nMenuComponent = 0;      var nLenMenuComponents = this.aMenuComponents.length;      var oMenuComponent = null;       for (; nMenuComponent < nLenMenuComponents; ) {          oMenuComponent = this.aMenuComponents[nMenuComponent];          oMenuComponent.print();          nMenuComponent = nMenuComponent + 1;      }  };

注意上述代码,除了实现了添加、删除、获取方法外,打印print方法是首先打印当前菜品信息,然后循环遍历打印所有子菜品信息。

第四步,创建指定的菜品:

我们可以创建几个真实的菜品,比如晚餐、咖啡、糕点等等,其都是用Menu作为其原型,代码如下:

var DinnerMenu = function () {      Menu.apply(this);  };  DinnerMenu.prototype = new Menu();   var CafeMenu = function () {      Menu.apply(this);  };  CafeMenu.prototype = new Menu();   var PancakeHouseMenu = function () {      Menu.apply(this);  };  PancakeHouseMenu.prototype = new Menu();

第五步,创建最***的菜单容器&mdash;&mdash;菜单本:

var Mattress = function (aMenus) {      this.aMenus = aMenus;  };  Mattress.prototype.printMenu = function () {      this.aMenus.print();  };

该函数接收一个菜单数组作为参数,并且值提供了printMenu方法用于打印所有的菜单内容。

第六步,调用方式:

var oPanCakeHouseMenu = new Menu("Pancake House Menu", "Breakfast");  var oDinnerMenu = new Menu("Dinner Menu", "Lunch");  var oCoffeeMenu = new Menu("Cafe Menu", "Dinner");  var oAllMenus = new Menu("ALL MENUS", "All menus combined");   oAllMenus.add(oPanCakeHouseMenu);  oAllMenus.add(oDinnerMenu);   oDinnerMenu.add(new MenuItem("Pasta", "Spaghetti with Marinara Sauce, and a slice of sourdough bread", true, 3.89));  oDinnerMenu.add(oCoffeeMenu);   oCoffeeMenu.add(new MenuItem("Express", "Coffee from Machine", false, 0.99));   var oMattress = new Mattress(oAllMenus);  console.log("---------------------------------------------");  oMattress.printMenu();  console.log("---------------------------------------------");

熟悉asp.net控件开发的同学,是不是看起来很熟悉?

总  结

组合模式的使用场景非常明确:

  1. 你想表示对象的部分-整体层次结构时;

  2. 你希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象(方法)

另外该模式经常和装饰者一起使用,它们通常有一个公共的父类(也就是原型),因此装饰必须支持具有add、remove、getChild操作的 component接口。

到此,关于“JavaScript组合模式的简单介绍”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: JavaScript组合模式的简单介绍

本文链接: https://www.lsjlt.com/news/79852.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript组合模式的简单介绍
    这篇文章主要介绍“JavaScript组合模式的简单介绍”,在日常操作中,相信很多人在JavaScript组合模式的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2022-10-19
  • Java单例模式简单介绍
    一、概念单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,...
    99+
    2023-05-31
    java 单例模式 ava
  • java设计模式中的单例模式简单介绍
    这篇文章主要介绍“java设计模式中的单例模式简单介绍”,在日常操作中,相信很多人在java设计模式中的单例模式简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java设计模式中的单例模式简单介绍”的疑...
    99+
    2023-06-02
  • 设计模式和反模式简单介绍
    作为一个资深开发人员,大家都应该听说过设计模式(design pattern),但是不是所有的人都听说过反模式(anti-pattern)。今天我们就来谈谈后者,何为反模式。谈反模式之前当然先要谈谈何为设计模式,因为两者是紧密联系在一起的。...
    99+
    2023-06-03
  • JavaScript闭包的简单介绍
    本篇内容主要讲解“JavaScript闭包的简单介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript闭包的简单介绍”吧!什么是JS闭包?先看一...
    99+
    2022-10-19
  • PostgreSQL中的数组简单介绍
    本篇内容介绍了“PostgreSQL中的数组简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!假设你在...
    99+
    2022-10-18
  • 简单介绍Android中Activity的四种启动模式
    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activit...
    99+
    2022-06-06
    启动 activity Android
  • ADO对象模型的简单介绍
    本篇内容介绍了“ADO对象模型的简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ADO对象模型是ActiveX Data Object...
    99+
    2023-06-17
  • JavaScript事件类型的简单介绍
    这篇文章主要讲解了“JavaScript事件类型的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript事件类型的简单介绍”吧!DOM事...
    99+
    2022-10-19
  • CSS文本格式的简单介绍
    这篇文章主要介绍“CSS文本格式的简单介绍”,在日常操作中,相信很多人在CSS文本格式的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS文本格式的简单介绍”的疑惑...
    99+
    2022-10-19
  • JavaScript的适配器模式介绍
    本篇内容介绍了“JavaScript的适配器模式介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!介&nb...
    99+
    2022-10-19
  • JavaScript严格模式usestrict的介绍
    目录1.概述1.1严格模式是什么1.2严格模式的目的2.开启严格模式2.1全局开启严格模式2.2局部开启严格模式3.严格模式中的变量3.1禁止意外创建变量3.2静默失败转为异常3.3...
    99+
    2022-11-12
  • node.js中http模块和url模块的简单介绍
    前言 本文主要给大家介绍了关于node.js中http模块与url模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 一、http模块的简单介绍 node.js当中的http内...
    99+
    2022-06-04
    模块 简单 js
  • 单例模式的介绍和用法
    本篇内容主要讲解“单例模式的介绍和用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“单例模式的介绍和用法”吧!问题1、说说单例模式的特点2、你知道单例模式的具体...
    99+
    2022-10-19
  • 简单谈谈JavaScript寄生式组合继承
    组合继承 组合继承也被称为伪经典继承,它综合了我们昨天说的原型链和盗用构造函数,将俩者的有点结合在了一起。它的基本思想是使用原型链继承原型上的属性和方法,通过盗用构造函数继承实例属...
    99+
    2022-11-12
  • node.js中debug模块的简单介绍与使用
    前言 相信使用node.js的朋友们都知道,一般在nodejs需要进行调试的时候,可以使用console.log()方法来将调试信息输出到控制台,当发布到生产环境的时候,需要将这些调试信息都注释掉,为了方便...
    99+
    2022-06-04
    模块 简单 node
  • javaScript深拷贝和浅拷贝的简单介绍
    目录基本数据类型在数据结构当中引用数据类型浅拷贝-深拷贝浅拷贝浅拷贝小结深拷贝结尾源码地址在了解深拷贝和浅拷贝之前,我们先梳理一下: JavaScript中,分为基本数据类型(原始值...
    99+
    2022-11-13
  • SQLite中的运算符表达式简单介绍
    本篇内容介绍了“SQLite中的运算符表达式简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SQLite中的运算符表达式在SQLite...
    99+
    2023-06-05
  • Python第三方常用模块openpyxl的简单介绍
    目录openpyxl创建文件Workbook() —创建 excel 文件Workbook.create_sheet() —创建 excel 工作簿Works...
    99+
    2022-11-11
  • JavaScript中标识符的命名规则简单介绍
    本篇内容主要讲解“JavaScript中标识符的命名规则简单介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中标识符的命名规则简单介绍”吧...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作