/**
*有这样一个需求
*有一个学校有2个班(一班,二班)
*每个班级分2个小组(一班一组,一班二组,二班一组,二班二组)
*学校计算机教室有限,每一个小组分着来上课.
*考试的时候大家一起考
*请用程序来模拟这个需求
*/
(function(){
//不用组合模式
//学校类
var school = function(name){
this.name = name;
//班级
var classes = new Array();
this.addClasses = function(cla){
classes.push(cla);
return this;
}
this.getClasses = function(){
return classes;
}
}
//班级类
var classes = function(name){
this.name = name;
var groups = new Array();
this.getGroup = function(){
return groups;
}
this.addGroup = function(group){
groups.push(group);
return this;
}
}
//组
var group = function(name){
this.name = name;
var students = new Array();
this.getStudent = function(){
return students;
}
this.addStudent = function(stu){
students.push(stu);
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 i = new student("i");
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).addStudent(i)
two.addGroup(twoOne).addGroup(twoTwo);
var usPcat = new school("波斯卡特计算机培训学校");
usPcat.addClasses(one).addClasses(two); //调用 就写一个 一班一组去上课
var classes= usPcat.getClasses();
for (var i = 0; i < classes.length; i++) {
if(classes[i].name == "一班"){
for (var j = 0; j < classes[i].getGroup().length; j++) {
// document.write(classes[i].getGroup()[j])
if(classes[i].getGroup()[j].name == "一班一组"){
var s = classes[i].getGroup()[j].getStudent();
for (var k = 0; k < s.length; k++) {
s[k].goToClass();
}
}
} }
}
//我快些吐了
//这种方法一定不是和业务的扩展
})()
/**
* 组合模式
*/
(function(){
//统一接口
var composite = new Interface("composite",["getChildByName","add"]);
var student= new Interface("composite",["goToClass","finishClass"]); //定义组合类
var compositeObj = function(name){
this.name = name;
this.type = "com";//默认是组合类
var childs = new Array();
//得到相关的所有孩子节点
this.getChildByName = function(name){
//涉及到递归
var toChilds = new Array();
if(!name){//没有传名字,左根遍历树
for (var i = 0; i < childs.length; i++) {
if(childs[i].type == "com"){
toChilds = toChilds.concat(childs[i].getChildByName());
}else{
toChilds.push(childs[i]);
}
}
}else{//左先根查找树
for (var i = 0; i < childs.length; i++) {
if(childs[i].name == name){
if(childs[i].type == "com"){
toChilds = toChilds.concat(childs[i].getChildByName());
break;
}else{
toChilds.push(childs[i]);
break;
}
}else{
if(childs[i].type == "com"){
toChilds = toChilds.concat(childs[i].getChildByName(name));
}
}
}
}
return toChilds;
}
//增加子节点
this.add = function(child){
childs.push(child);
return this;
}
//去上课
this.goToClass = function(name){
var toChilds = this.getChildByName(name);
for (var i = 0; i < toChilds.length; i++) {
toChilds[i].goToClass();
}
}
//下课
this.finishClass = function(name){
var toChilds = this.getChildByName(name);
for (var i = 0; i < toChilds.length; i++) {
toChilds[i].finishClass();
}
}
Interface.ensureImplements(this,composite,student)
} //定义叶子类
var studentObj = function(name){
this.name = name;
this.type = "stu";//默认是叶子
//得到相关的所有孩子节点
this.getChildByName = function(name){
if(this.name == name){
return this;
}else{
return null;
}
}
//增加子节点
this.add = function(child){
throw new Error("add 不成被初始化(在叶子了中)");
}
//去上课
this.goToClass = function(name){
document.write(this.name +" 去上课<br>");
}
//下课
this.finishClass = function(name){
document.write(this.name +" 下课<br>");
}
Interface.ensureImplements(this,composite,student)
} //测试
var a = new studentObj("a");
var b = new studentObj("b");
var c = new studentObj("c");
var d = new studentObj("d");
var e = new studentObj("e");
var f = new studentObj("f");
var g = new studentObj("g");
var h = new studentObj("h");
var i = new studentObj("i");
var one = new compositeObj("一班");
var oneOne = new compositeObj("一班一组");
oneOne.add(a).add(b);
var oneTwo = new compositeObj("一班二组");
oneTwo.add(c).add(d); one.add(oneOne).add(oneTwo);
var two = new compositeObj("二班");
var twoOne = new compositeObj("二班一组");
twoOne.add(e).add(f);
var twoTwo = new compositeObj("二班二组");
twoTwo.add(g).add(h).add(i)
two.add(twoOne).add(twoTwo);
var usPcat = new compositeObj("波斯卡特计算机培训学校");
usPcat.add(one).add(two);
//客户端调用API
usPcat.goToClass();
document.write("-------------------------<br>");
usPcat.goToClass("一班");
document.write("-------------------------<br>");
usPcat.goToClass("二班一组");
document.write("-------------------------<br>");
usPcat.goToClass("a");
})()

js39---组合模式,查找遍历树的更多相关文章

  1. 组合模式(遍历树,file基表示文件也表示文件夹)

    组合模式多个对象形成树形结构以表示“整体--部分”的结构层次.组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性. 组合模式又可以称为“合成模式“ 或 ”整体-部分模式”,属于对 ...

  2. 【Unity3D】资源对象、预设、查找对象、组合模式等知识点

    1.解释对象与资源区别于联系,根据官方案例,分别总结资源和对象组织的规则/规律.    下载并查看了Adam和Survival Shooter tutorial两个官方资源案例,这些案例作为资源,可以 ...

  3. Hibernate:组合模式解决树的映射

    树经常用来展示目录结构,那么在Hibernate中怎样解决树的映射问题呢? 先来看一个分销商的树形结构的例子 所有分销商 东北区 辽宁省 沈阳医药 吉林省 华北区 北京市 北京医药 河北省 华南区 那 ...

  4. Composite 组合模式 树 递归 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. 《Head First 设计模式》之迭代器与组合模式——遍历合并的菜单

    迭代器与组合模式(Iterator & Composite) 迭代器:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 组合:允许你将对象组成树形结构来表现“整体.部分” ...

  6. .NET设计模式(11):组合模式(Composite Pattern)(转)

    概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对 ...

  7. 24种设计模式--组合模式【Composite Pattern】

    大家在上学的时候应该都学过“数据结构”这门课程吧,还记得其中有一节叫“二叉树”吧,我们上学那会儿这一章节是必考内容,左子树,右子树,什么先序遍历后序遍历什么,重点就是二叉树的的遍历,我还记得当时老师就 ...

  8. 第 15 章 组合模式【Composite Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 大家在上学的时候应该都学过“数据结构”这门课程吧,还记得其中有一节叫“二叉树”吧,我们上 学那会儿这一章节是必考内容,左 ...

  9. 设计模式组合模式(Composite)精华

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建 ...

随机推荐

  1. Android中图片优化之webp使用

    博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 有关图片的优化,通常我们会用到LruCache(使用强引用.强 ...

  2. What is x86 Conforming Code Segment?

    SRC=Microprocessor Based Systems SRC=Computer Architecture: A Quantitative Approach

  3. Android设置背景图片平铺

    以LinearLayout为例,它提供的background属性将会将背景图片拉伸,相当难看.其实我们仅仅需做少量的改动就能够实现web编程中css背景图片的效果.来试试吧. 创建反复的背景图片 在d ...

  4. Android 4.3 系统裁剪——删除不使用的app及添加自己app

    删除不使用的apk 系统自带的app位置是在/android4.3/packages/apps 以下是一些APP作用分析: | |– BasicSmsReceiver | |– Bluetooth ( ...

  5. CCNP路由实验之九 路由策略

     CCNP路由实验之九 路由策略 路由器在公布与接收路由信息时,可能须要实施一些策略.以便对路由信息进行过滤,比如仅仅接收或公布满足一定条件的路由信息. 一种路由协议可能须要引入其它的路由协议发现 ...

  6. JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递

    本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态 链 ...

  7. UVALive - 6266 Admiral 费用流

    UVALive - 6266 Admiral 题意:找两条完全不相交不重复的路使得权值和最小. 思路:比赛的时候时间都卡在D题了,没有仔细的想这题,其实还是很简单的,将每个点拆开,连一条容量为1,费用 ...

  8. SELinux 入门

    几乎可以肯定每个人都听说过 SELinux (更准确的说,尝试关闭过),甚至某些过往的经验让您对 SELinux 产生了偏见.不过随着日益增长的 0-day 安全漏洞,或许现在是时候去了解下这个在 L ...

  9. $_FILES参数详解及简单<form>表单无刷新上传文件

    $_FILES:经由 HTTP POST 文件上传而提交至脚本的变量,类似于旧数组$HTTP_POST_FILES 数组(依然有效,但反对使用)详细信息可参阅 POST方法上传 $_FILES数组内容 ...

  10. dedecms关键词维护里面字数多的词优先字数少的词的解决办法

    织梦后台的关键词维护默认的情况是字数少的词优先于字数多的词,比如我们有两个这样的词:创业.创业方向,第二个词包含了第一个词,在文章中如果出现“创业方向”这个词,默认情况下只会给创业两个字添加关键词超链 ...