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 相关文章推荐
jQuery 使用个人心得
Feb 26 Javascript
jquery获取div距离窗口和父级dv的距离示例
Oct 10 Javascript
javascript中typeof的使用示例
Dec 19 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
Dec 13 Javascript
JavaScript数组迭代方法
Mar 03 Javascript
Vue.js 60分钟快速入门教程
Mar 28 Javascript
vue v-model表单控件绑定详解
May 17 Javascript
Javascript调试之console对象——你不知道的一些小技巧
Jul 10 Javascript
浅谈sass在vue注意的地方
Aug 10 Javascript
vue+axios+mock.js环境搭建的方法步骤
Aug 28 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
Sep 02 Javascript
JavaScript代码异常监控实现过程详解
Feb 17 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/10/09 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
php多线程并发实现方法
2016/09/30 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
2019/04/02 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
JQuery中each()的使用方法说明
2010/08/19 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
深入理解python中的select模块
2017/04/23 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
全面分析Python的优点和缺点
2018/02/07 Python
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
2020/11/17 Python
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
JAVA软件工程师测试题
2014/07/25 面试题
中学运动会广播稿
2014/01/19 职场文书
工程开工庆典邀请函
2014/02/01 职场文书
暑期社会实践感言
2014/02/25 职场文书
投资意向书范本
2014/04/01 职场文书
驻村工作先进事迹
2014/08/14 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
护士自荐信怎么写
2015/03/06 职场文书
党章学习心得体会2016
2016/01/14 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python