JavaScript设计模式-13.组合模式

  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>

 

posted @ 2017-07-16 21:06  橙云生  阅读(161)  评论(0编辑  收藏  举报