JavaScript组合模式---引入案例分析


Posted in Javascript onMay 23, 2020

本文实例讲述了JavaScript组合模式。分享给大家供大家参考,具体如下:

首先:

使用一个例子来引入组合模式,需求为
(1)有一个学校有2个班(一班,二班)
(2)每个班级分2个小组(一班一组,一班二组,二班一组,二班二组)
(3)学校计算机教室有限,每一个小组分着来上课

然后:根据需求我们可以简单看出这里面涉及到   学校,班级,组,和学生总共4个类

使用程序模拟  这4个类为,

(1)学校类

var school=function (name) {
  this.name=name;
  var classes=new Array();
   this.addClasses=function (cla) {
   classes.push(classe);
   }
   this.getClass=function () {
    return classes;
   }
 }

(2)班级类

//班级类
 var classes=function (name) {
  this.name = name;
  var groups = new Array();
  this.addGroup = function (group) {
   groups.push(group);
   return this;
  };
  this.getGroups = function () {
   return groups;
  }
 };

(3)组类

//组
 var group=function (name) {
  this.name=name;
  var students=new Array();
  var addStudents=function (student) {
   students.push(student);
   return this;
  }
   this.geStudent=function () {
    return students;
   }
 };

(4)学生类

//学生类
  var student=function (name) {
   this.name=name;
   this.gotoClass=function () {
    document.write(name+":我是学生,我要去上课 ")
   };
   this.finishClass=function () {
    document.write(name+": 终于下课了");
   }
  };

其次,测试需满足如下为:

(1)每个班级分2个小组(一班一组,一班二组,二班一组,二班二组)
(2)学校计算机教室有限,每一个小组的学生分着来上课
(3)现在我们倒着写,从学生-->组->班级-->学校

//学生实例
 var astudent=new student("我是a同学");
 var bstudent=new student("我是b同学");
 var cstudent=new student("我是c同学");
 var dstudent=new student("我是d同学");
 var estudent=new student("我是e同学");
 var fstudent=new student("我是f同学");
 var gstudent=new student("我是g同学");
 var hstudent=new student("我是h同学");
 var istudent=new student("我是i同学");

//班级实例(1)
  var class1=new classes("一班");
  //组1
 var oneOne=new group("一班一组");
  //组中添加学生
 oneOne.addStudents(astudent).addStudents(bstudent);
 //组2
 var oneTwo=new group("一班二组");
 //组中添加学生
 oneTwo.addStudents(cstudent).addStudents(dstudent);

 class1.addGroup(oneOne).addGroup(oneTwo);
 //班级实例2
 var class2=new classes("二班");
 //组1
 var towOne=new group("二班一组");
 //组中添加学生
 towOne.addStudents(estudent).addStudents(fstudent);

 //组2
 var towTwo=new group("二班二组");
 //组中添加学生
 towTwo.addStudents(gstudent).addStudents(hstudent).addStudents(istudent);
 //
 class2.addGroup(towOne).addGroup(towTwo);

 //学校实例
 var usSchool=new school("组合模式学校");

最后,开学了,我们准备按照要求去上课吧,

安排为:一班一组去上课 学校-->班级-->组-->学生

var classes=usSchool.getClass();//班级
  for(var i=0;i<classes.length;i++){
   if(classes[i].name=="一班"){
    for(var j=0;j<classes[i].getGroups().length;j++){
     if(classes[i].classes[i].getGroups()[j]=="一组"){
      var students=classes[i].classes[i].getGroups()[j].geStudent();
      for(var k=0;k<students.length;k++){
       students[k].gotoClass();
      }
     }
    }
   }
  }

最后,我只是想安排一个都要写这么多的代码,那如何是一个学校有上千个班级,那么要疯了。

这种一定不适合业务的扩展,为此我们使用组合模式来解决上述的问题。
为啥要用设计模式呢?
因为设计模式有如下的一些操作方式:
(1)组合模式中把对象分为两种(组合对象,和叶子对象)
(2)组合对象和叶子对象实现:同一批操作
(3)对组合对象执行的操作可以向下传递到叶子节点进行操作
(4)这样就会弱化类与类之间的耦合
(5)他常用的手法是把对象组合成属性结构的对象

接下来介绍:JavaScript组合设模式--改进上述引入的例子

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

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

Javascript 相关文章推荐
兼容Mozilla必须知道的知识。
Jan 09 Javascript
JS模拟多线程
Feb 07 Javascript
JS模拟面向对象全解(二、类型与赋值)
Jul 13 Javascript
Javascript单元测试框架QUnitjs详细介绍
May 08 Javascript
js实现按钮控制图片360度翻转特效的方法
Feb 17 Javascript
函数window.open实现关闭所有的子窗口
Aug 03 Javascript
一道关于JavaScript变量作用域的面试题
Mar 08 Javascript
Node.js常用工具之util模块
Mar 09 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
Jun 07 jQuery
angular.js和vue.js中实现函数去抖示例(debounce)
Jan 18 Javascript
JavaScript实现的开关灯泡点击切换特效示例
Jul 08 Javascript
详解ES6 Promise的生命周期和创建
Aug 18 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
May 23 #Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
May 23 #Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
May 23 #Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
May 22 #Javascript
微信小程序点击滚动到指定位置的实现
May 22 #Javascript
使用JavaScript通过前端发送电子邮件
May 22 #Javascript
uni-app微信小程序登录授权的实现
May 22 #Javascript
You might like
中东人咖啡哲学
2021/03/03 咖啡文化
PHP 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
PHP中基本符号及使用方法
2010/03/23 PHP
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
TFDN图片播放器 不错自动播放
2006/10/03 Javascript
javascript数组使用调用方法汇总
2007/12/08 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
Eyeko美国:屡获殊荣的睫毛膏、眼线笔和眉妆
2018/07/05 全球购物
物业管理专业个人的自我评价
2013/11/19 职场文书
语文教研活动总结
2014/07/02 职场文书
党员自我剖析材料
2014/08/31 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
乡镇团代会开幕词
2016/03/04 职场文书