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实现真实字符串剩余字数提示的实例代码
Oct 22 Javascript
javascipt匹配单行和多行注释的正则表达式
Nov 20 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
Mar 04 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
Sep 21 Javascript
Angular JS 生成动态二维码的方法
Feb 23 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
Mar 27 Javascript
ES6新特性之Symbol类型用法分析
Mar 31 Javascript
jquery replace方法去空格
May 08 jQuery
Angular2使用Augury来调试Angular2程序
May 21 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
Aug 22 Javascript
JS实现点击拉拽轮播图pc端移动端适配
Sep 05 Javascript
JS中箭头函数与this的写法和理解
Jan 14 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
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
php轻松实现文件上传功能
2016/03/03 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
Node.js获取前端ajax提交的request信息
2017/02/20 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
python中的代码编码格式转换问题
2015/06/10 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
python实现函数极小值
2019/07/10 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
python实现扫雷小游戏
2020/04/24 Python
python 读取.nii格式图像实例
2020/07/01 Python
Python字符串函数strip()原理及用法详解
2020/07/23 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
HTML5 Canvas绘制圆点虚线实例
2015/01/01 HTML / CSS
季度思想汇报
2014/01/01 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
评职称个人总结
2015/03/05 职场文书
2016大学生党校学习心得体会
2016/01/06 职场文书