javascript 设计模式之组合模式原理与应用详解


Posted in Javascript onApril 08, 2020

本文实例讲述了javascript 设计模式之组合模式原理与应用。分享给大家供大家参考,具体如下:

组合模式说明

组合模式用于简单化,一致化对单组件和复合组件的使用;其实它就是一棵树;

这棵树有且只有一个根,访问入口,如果它不是一棵空树,那么由一个或几个树枝节点以及子叶节点组成,每个树枝节点还包含自己的子树枝以及子叶节点;

在面向对象编程中,叶子以及复杂对象(树枝节点)都继承一个接口或抽象类分别实现;

这个抽象定义一般三个部分组成,组件的基本信息,Add方法,Remove方法;

叶子节点只包含本身的数据,Add, Remove 基本为空操作;

树枝节点实现组件时,一般包含一个数组定义,用于存储子叶或树枝节点,还包括一个获取所有子节点的方法: 如GetList;

实例场景:

1>. 自然界中的各种树,树长在大地人,树头(树根),即是入口点,这棵树头向上生长,即有自己的叶子,又有自己的子树枝,某树枝还有自己的叶子,跟子树枝;

2>. 操作系统目录结构、公司部门组织架构、国家省市县、宇宙万物都有单独元物质以及物物包含的现象,像这么看起来复杂的现象,都可以使用组合模式,即部分-整体模式来操作;

一棵树:

javascript 设计模式之组合模式原理与应用详解

 组合模式结构图:

javascript 设计模式之组合模式原理与应用详解

实例源码

1. Component 组件;

function Component() {
  this.name = '';
}

Component.prototype = {
  Add: function(comp) {
    //rewrite
  },
  Remove: function(name) {
    //rewrite
  },
  set: function(name) {
    this.name = name;
  },
  operate: function() {
    //...
  }
}
var comp = new Component();

2. Leaf 叶子节点;

function Leaf() {
  
}

Leaf.prototype = Object.create(comp, {});

Leaf.prototype.get = function() {
  return this.name;
}

3. 树枝节点:

function Composite() {
  this.list = [];
}

Composite.prototype = Object.create(comp, {});

Composite.prototype = {
  Add: function(comp) {
    this.list.push(comp);
  },
  Remove: function(name) {
    for (i in this.list) {
      var cmp = this.list[i];
      if (cmp.name == name) {
        delete this.list[i];
        break;
      }
    }
  },
  operate: function() {
    //do...
  },
  getList: function(name) {
    var cmp;
    for (i in this.list) {
      cmp = this.list[i];
      if (cmp.name == name) {
        break;
      }
    }
    return cmp;
  }
}

叶子节点基本可以直接使用 Component 的结构,或是直接以 Component 来创建,Composite 树枝节点,就必须重写 Add , Remove, operate 等方法;

使用方法:

var root = new Composite();
root.set("root");

//叶子
var leaf = new Leaf();
leaf.set('顶级叶子');

root.Add(leaf);

//树枝节点;
var child = new Composite();
child.set('child');

var childschild = new Composite();
childschild.set('cchild');

child.Add(childschild);

root.Add(child);

root.operate();

其他说明

组合模式,是一种结构型的设计模式,主要用于一致化处理简单元素和复杂元素操作,使得客户端使用可以与复合结构复杂的情况相解藕;客户端使用时,搜索递归到需要的节点或位置,都可以使用统一方法,不管是叶子节点或是树枝节点进行一致操作;在面向对象动态语言里,其实Javascript 也差不多,就可以无需知道元素结构,进行查询,添加,删除的操作;

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 短路法代码精简
Aug 20 Javascript
JavaScript 应用技巧集合[推荐]
Aug 30 Javascript
JavaScript 数组循环引起的思考
Jan 01 Javascript
jquery下异步提交表单 异步跨域提交表单
Nov 17 Javascript
window.open打开页面居中显示的示例代码
Dec 27 Javascript
2则自己编写的jQuery特效分享
Feb 26 Javascript
asp.net+js实现金额格式化
Feb 27 Javascript
js文本框走动跑马灯效果代码分享
Aug 25 Javascript
jQuery实现的简单拖拽功能示例
Sep 13 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
Feb 23 Javascript
Javascript中的async awai的用法
May 17 Javascript
webpack-dev-server远程访问配置方法
Feb 22 Javascript
JS async 函数的含义和用法实例总结
Apr 08 #Javascript
微信小程序以ssm做后台开发的实现示例
Apr 08 #Javascript
JS co 函数库的含义和用法实例总结
Apr 08 #Javascript
JS Thunk 函数的含义和用法实例总结
Apr 08 #Javascript
JS Generator 函数的含义与用法实例总结
Apr 08 #Javascript
Vue列表循环从指定下标开始的多种解决方案
Apr 08 #Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
Apr 08 #Javascript
You might like
PHP的面试题集,附我的答案和分析(一)
2006/11/19 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
详谈PHP编码转换问题
2015/07/28 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
js模拟hashtable的简单实例
2014/03/06 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
Python实现测试磁盘性能的方法
2015/03/12 Python
详细解析Python当中的数据类型和变量
2015/04/25 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
试述DBMS的主要功能
2016/11/13 面试题
工作违纪检讨书
2014/02/17 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
大学生求职信
2014/06/17 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
网络营销计划
2015/01/17 职场文书
JS + HTML 罗盘式时钟的实现
2021/05/21 Javascript
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA