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 相关文章推荐
WEB 浏览器兼容 推荐收藏
May 14 Javascript
jQuery 定时局部刷新(setInterval)
Nov 19 Javascript
基于jquery的无刷新分页技术
Jun 11 Javascript
Js与Jq获取浏览器和对象值的方法
Mar 18 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
Aug 23 Javascript
基于JavaScript实现的希尔排序算法分析
Apr 14 Javascript
Vue2.x中的父子组件相互通信的实现方法
May 02 Javascript
AngularJS路由删除#符号解决的办法
Sep 28 Javascript
详解React开发必不可少的eslint配置
Feb 05 Javascript
JS使用setInterval实现的简单计时器功能示例
Apr 19 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
React实现类似淘宝tab居中切换效果的示例代码
Jun 02 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抽象类使用要点与注意事项分析
2015/02/09 PHP
Yii2增加验证码步骤详解
2016/04/25 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
表单提交验证类
2006/07/14 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
用js动态添加html元素,以及属性的简单实例
2016/07/19 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
简单实现js拖拽效果
2017/07/25 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
跟老齐学Python之永远强大的函数
2014/09/14 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
详解Python3 基本数据类型
2019/04/19 Python
解决python 上传图片限制格式问题
2019/10/30 Python
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
美国校服网上商店:French Toast
2019/10/08 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
房屋租赁授权委托书范本
2014/09/20 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
公司年夜饭通知
2015/04/25 职场文书
陪护人员误工证明
2015/06/24 职场文书
辞职信怎么写?你都知道吗?
2019/06/24 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js
HttpClient实现文件上传功能
2022/08/14 Java/Android