<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Javascript高级语法13-组合模式</title>
</head>
<body>
<script>
/*组合模式:
*/ function demo1(){
/*需求: 有一个学校,有两个班(1班,2班),
* 每个班分两个小组(1班1组,1班2组,2班1组,2班2组)
* 学校计算机教室有限,每一个小组分着来上课,考试时候大家一起考
*/
//不用组合模式
var school = function(name){
this.name = name;
var classes = new Array();
this.addClass = function(cla){
classes.push(cla);
return this;
}
this.getClasses = function(){
return classes;
}
}
//班级类
var classes = function(name){
this.name = name;
var groups = new Array();
this.getGroups = function(){
return groups;
}
this.addGroup = function(group){
groups.push(group);
return this;
}
}
//组
var group = function(name){
this.name = name;
var students = new Array();
this.getStudents = function(){
return students;
}
this.addStudent = function(student){
students.push(student);
return this;
}
}
//学生类
var student = function(name){
this.name = name;
this.goToClass = function(){
document.write(this.name+" 去上课!")
}
this.finishClass = function(){
document.write(this.name+" 下课!")
}
}
//测试
var a = new student("a");
var b = new student("b");
var c = new student("c");
var d = new student("d");
var e = new student("e");
var f = new student("f");
var g = new student("g");
var h = new student("h");
var one = new classes("一班");
var oneOne = new group("一班一组");
oneOne.addStudent(a).addStudent(b);
var oneTwo = new group("一班二组");
oneTwo.addStudent(c).addStudent(d);
one.addGroup(oneOne).addGroup(oneTwo);
var two = new classes("二班");
var twoOne = new group("二班一组");
twoOne.addStudent(e).addStudent(f);
var twoTwo = new group("二班二组");
twoTwo.addStudent(g).addStudent(h);
two.addGroup(twoOne).addGroup(twoTwo);
var xuexiao = new school("新学校");
xuexiao.addClass(one).addClass(two); //调用 一班一组去上课
var classes = xuexiao.getClasses();
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].getGroups()[j].name == "一班一组"){
var s = classes[i].getGroups()[j].getStudents();
for(var k=0;k<s.length;k++){
s[k].goToClass();
}
}
}
}
}
//这种方法不适合业务扩展,效率非常低
}
// demo1();
/*组合模式:
* 1.组合模式中把对象分为两种(组合对象和叶子对象)
* 2.组合对象和叶子对象实现同一批操作
* 3.对组合对象执行的操作可以向下传递到叶子节点进行操作
* 4.这样就会弱化类与类之间的耦合
* 5.常用的手法就是把对象组合成属性结构的对象。
* 组合是离不开递归的。
*/ </script>
</body>
</html>

JavaScript设计模式-13.组合模式的更多相关文章

  1. JavaScript设计模式之----组合模式

    javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...

  2. 再起航,我的学习笔记之JavaScript设计模式15(组合模式)

    组合模式 组合模式(Composite): 又称部分-整体模式,将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 如果有一个 ...

  3. JavaScript设计模式(5)-组合模式

    组合模式 1. 适合使用组合模式的条件: 存在一批组织成某种层次体系的对象,如树形结构(具体的结构在开发期间可能无法得知) 希望对这批对象或其中的一部分对象实施一个相同的操作 2. 注意点: 组合对象 ...

  4. JavaScript设计模式-14.组合模式实现

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. JS常用的设计模式(13)——组合模式

    组合模式又叫部分-整体模式,它将所有对象组合成树形结构.使得用户只需要操作最上层的接口,就可以对所有成员做相同的操作. 一个再好不过的例子就是jquery对象,大家都知道1个jquery对象其实是一组 ...

  6. 从ES6重新认识JavaScript设计模式(三): 建造者模式

    1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示. 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序建造出不 ...

  7. C#设计模式(10)——组合模式(Composite Pattern)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

  8. c++设计模式15 --组合模式

    今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...

  9. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

随机推荐

  1. B-spline Curves 学习之B样条曲线性质(5)

    B-spline Curves: Important Properties 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. ...

  2. kali下firefox的安装

    在kali的系统中自带了一个firefox分支下的浏览器Iceweasel(Iceweasel是Mozilla Firefox浏览器的Debian再发布版),但是怎么说也配不上kali的强悍气势.还是 ...

  3. task3:词频统计

    相关的类: java.util.regex.Pattern static Pattern compile(String regex) //编译模式 static Pattern compile(Str ...

  4. Tempdb--查看TempDB上是否需要增加文件

    SELECT [owt].[session_id], [owt].[exec_context_id], [owt].[wait_duration_ms], [owt].[wait_type], [ow ...

  5. TSQL--聚合函数

    --======================================================== --COUNT --COUNT(1) 和COUNT(*) 计算结果相同,COUNT ...

  6. raiserror 的用法

    if exists(select top 1 UserName from [dbo].[LJS_Test_User] where UserName=@UserName) begin raiserror ...

  7. sql查询优化--数字转换字符串字段

    SELECT top 1 pt.* FROM t1where id='20180731223014' SELECT top 1 pt.* FROM t1where id='0180731223014 ...

  8. EasyUi控件Datagrid

    很久没有打开我的博客园,刚刚大概扫了一眼我之前写的笔记,关于Devexpress那篇居然有四千多的浏览记录,不知道对浏览过的博友有没有起到一点点作用.当然我写笔记仅仅只是给自己留个记忆,如果歪打正着帮 ...

  9. C#基础笔记(第十六天)

    1.进程复习//通过进程去打开应用程序 Process.Start("calc"); Process.Start("mspaint"); Process.Sta ...

  10. django系列8.2--django的中间件流程

    Django请求流程图 请求到达中间件之后,先按照正序执行每个注册中间件的process_reques方法,process_request方法返回的值是None,就依次执行,如果返回的值是HttpRe ...