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

时间:2022-06-26 19:43:50
 <!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>