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 相关文章推荐
比较搞笑的js陷阱题
Feb 07 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
Aug 30 Javascript
对JavaScript客户端应用编程的一些建议
Jun 24 Javascript
JS实现上下左右对称的九九乘法表
Feb 22 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
Sep 04 Javascript
解析vue、angular深度作用选择器
Sep 11 Javascript
Vue中函数防抖节流的理解及应用实现
Apr 24 Javascript
vue实现前端分页完整代码
Jun 17 Javascript
如何手写简易的 Vue Router
Oct 10 Javascript
使用TS来编写express服务器的方法步骤
Oct 29 Javascript
Element el-button 按钮组件的使用详解
Feb 01 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中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
ThinkPHP控制器间实现相互调用的方法
2014/10/31 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
javascript计时器详解
2015/02/28 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
Python缓存技术实现过程详解
2019/09/25 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
化学专业毕业生自荐信
2013/11/15 职场文书
化学实验员岗位职责
2013/12/28 职场文书
学生生病请假条范文
2014/02/16 职场文书
廉洁自律证明
2015/06/24 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang