1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Javascript高级语法13-组合模式</title> 6 </head> 7 <body> 8 <script> 9 /*组合模式: 10 */ 11 12 function demo1(){ 13 /*需求: 有一个学校,有两个班(1班,2班), 14 * 每个班分两个小组(1班1组,1班2组,2班1组,2班2组) 15 * 学校计算机教室有限,每一个小组分着来上课,考试时候大家一起考 16 */ 17 //不用组合模式 18 var school = function(name){ 19 this.name = name; 20 var classes = new Array(); 21 this.addClass = function(cla){ 22 classes.push(cla); 23 return this; 24 } 25 this.getClasses = function(){ 26 return classes; 27 } 28 } 29 //班级类 30 var classes = function(name){ 31 this.name = name; 32 var groups = new Array(); 33 this.getGroups = function(){ 34 return groups; 35 } 36 this.addGroup = function(group){ 37 groups.push(group); 38 return this; 39 } 40 } 41 //组 42 var group = function(name){ 43 this.name = name; 44 var students = new Array(); 45 this.getStudents = function(){ 46 return students; 47 } 48 this.addStudent = function(student){ 49 students.push(student); 50 return this; 51 } 52 } 53 //学生类 54 var student = function(name){ 55 this.name = name; 56 this.goToClass = function(){ 57 document.write(this.name+" 去上课!") 58 } 59 this.finishClass = function(){ 60 document.write(this.name+" 下课!") 61 } 62 } 63 //测试 64 var a = new student("a"); 65 var b = new student("b"); 66 var c = new student("c"); 67 var d = new student("d"); 68 var e = new student("e"); 69 var f = new student("f"); 70 var g = new student("g"); 71 var h = new student("h"); 72 var one = new classes("一班"); 73 var oneOne = new group("一班一组"); 74 oneOne.addStudent(a).addStudent(b); 75 var oneTwo = new group("一班二组"); 76 oneTwo.addStudent(c).addStudent(d); 77 one.addGroup(oneOne).addGroup(oneTwo); 78 var two = new classes("二班"); 79 var twoOne = new group("二班一组"); 80 twoOne.addStudent(e).addStudent(f); 81 var twoTwo = new group("二班二组"); 82 twoTwo.addStudent(g).addStudent(h); 83 two.addGroup(twoOne).addGroup(twoTwo); 84 var xuexiao = new school("新学校"); 85 xuexiao.addClass(one).addClass(two); 86 87 //调用 一班一组去上课 88 var classes = xuexiao.getClasses(); 89 for(var i=0;i<classes.length;i++){ 90 if(classes[i].name == "一班"){ 91 for(var j=0;j<classes[i].getGroups().length;j++){ 92 if(classes[i].getGroups()[j].name == "一班一组"){ 93 var s = classes[i].getGroups()[j].getStudents(); 94 for(var k=0;k<s.length;k++){ 95 s[k].goToClass(); 96 } 97 } 98 } 99 } 100 } 101 //这种方法不适合业务扩展,效率非常低 102 } 103 // demo1(); 104 /*组合模式: 105 * 1.组合模式中把对象分为两种(组合对象和叶子对象) 106 * 2.组合对象和叶子对象实现同一批操作 107 * 3.对组合对象执行的操作可以向下传递到叶子节点进行操作 108 * 4.这样就会弱化类与类之间的耦合 109 * 5.常用的手法就是把对象组合成属性结构的对象。 110 * 组合是离不开递归的。 111 */ 112 113 </script> 114 </body> 115 </html>