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>