我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript组合模式的简单介绍

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript组合模式的简单介绍

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript组合模式的简单介绍

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

下载Word文档

猜你喜欢

Java单例模式简单介绍

一、概念单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,
2023-05-31

java设计模式中的单例模式简单介绍

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

设计模式和反模式简单介绍

作为一个资深开发人员,大家都应该听说过设计模式(design pattern),但是不是所有的人都听说过反模式(anti-pattern)。今天我们就来谈谈后者,何为反模式。谈反模式之前当然先要谈谈何为设计模式,因为两者是紧密联系在一起的。
2023-06-03

简单介绍Android中Activity的四种启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。 Activity有四种启动模式:1. sta
2022-06-06

ADO对象模型的简单介绍

本篇内容介绍了“ADO对象模型的简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ADO对象模型是ActiveX Data Object
2023-06-17

node.js中http模块和url模块的简单介绍

前言 本文主要给大家介绍了关于node.js中http模块与url模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 一、http模块的简单介绍 node.js当中的http内置模块可以用于创建http服务器与
2022-06-04

node.js中debug模块的简单介绍与使用

前言 相信使用node.js的朋友们都知道,一般在nodejs需要进行调试的时候,可以使用console.log()方法来将调试信息输出到控制台,当发布到生产环境的时候,需要将这些调试信息都注释掉,为了方便切换而不需要改动程序代码,可以使用
2022-06-04

编程热搜

目录