<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javascript高级语法14-组合模式实现</title>
</head>
<body>
<script>
//接口
var Interface = function(name,methods){
if(arguments.length != 2){
alert("interface must have two paramters...");
}
this.name = name;//这个是接口的名字
this.methods = [];//定义个空数组来转载函数名
for (var i = 0; i < methods.length; i++) {
if(typeof methods[i] != "string"){
alert("method name must is String ...")
}else{
this.methods.push(methods[i])
}
}
}
//定义接口的一个静态方法来实现接口与实现类的直接检验
//静态方法不要写成Interface.prototype.* 因为这是写到接口原型连上的
//我们要把静态的函数直接写到类层次上
Interface.ensureImplements = function(object){
if(arguments.length<2){
alert("必须最少是2个参数");
return false;
}
//遍历
for (var i = 1; i < arguments.length; i++) {
var inter = arguments[i];
//如果你是接口就必须是Interface类型的
if(inter.constructor != Interface){
throw new Error("if is interface class must is Interface type");
}
//遍历函数集合并分析
for (var j = 0; j < inter.methods.length; j++) {
var method = inter.methods[j];
//实现类中必须有方法名字 和 接口中所有的方法名项目
if(!object[method] || typeof object[method] != "function"){
throw new Error("实现类并没有完全实现接口中的所有方法...");
}
}
}
} /*
* 组合模式
*/ function demo(){
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(); //子类的GoToClass方法
}
}
//下课
this.finishClass = function(name){
var toChilds = this.getChildByName(name);
for(var i=0;i<toChilds.length;i++){
toChilds[i].finishClass(); //子类的GoToClass方法
}
}
//接口验证
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 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);
two.add(twoOne).add(twoTwo);
var xuexiao = new compositeObj("新学校");
xuexiao.add(one).add(two); //客户端调用API
xuexiao.goToClass();
document.write("------------------------<br>");
xuexiao.goToClass("一班");
document.write("------------------------<br>");
xuexiao.goToClass("二班一组");
document.write("------------------------<br>");
xuexiao.goToClass("a"); }
demo();
</script>
</body>
</html>

JavaScript设计模式-14.组合模式实现的更多相关文章

  1. JavaScript设计模式之----组合模式

    javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...

  2. 再起航,我的学习笔记之JavaScript设计模式15(组合模式)

    组合模式 组合模式(Composite): 又称部分-整体模式,将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 如果有一个 ...

  3. JavaScript设计模式(5)-组合模式

    组合模式 1. 适合使用组合模式的条件: 存在一批组织成某种层次体系的对象,如树形结构(具体的结构在开发期间可能无法得知) 希望对这批对象或其中的一部分对象实施一个相同的操作 2. 注意点: 组合对象 ...

  4. 再起航,我的学习笔记之JavaScript设计模式14(桥接模式)

    桥接模式 桥接模式(Bridge): 在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦 从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式. 现在我们需要做一个导航 ...

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

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 从ES6重新认识JavaScript设计模式(三): 建造者模式

    1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示. 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序建造出不 ...

  7. C#设计模式(10)——组合模式(Composite Pattern)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

  8. c++设计模式15 --组合模式

    今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...

  9. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

随机推荐

  1. SQL编程:group by合并结果字符串 ---> group_concat函数就能行

    1.表结构 create table tt(id int,v varchar(30));              insert into tt values(1,'a'),(1,'b'),(2,'b ...

  2. 执行计划--WHERE条件的先后顺序对执行计划的影响

    在编写SQL时,会建议将选择性高(过滤数据多)的条件放到WHERE条件的前面,这是为了让查询优化器优先考虑这些条件,减少生成最优(或相对最优)的执行计划的时间,但最终的执行计划生成过滤顺序还是决定这些 ...

  3. C# Session操作

    Session.Abandon();//清除全部Session//清除某个SessionSession["UserName"] = null;Session.Remove(&quo ...

  4. .Net Core下使用Ajax,并传送参数到controllers

    可以使用URL拼接方式方法传参 .cshtml部分 @section Scripts{ @{ await Html.RenderPartialAsync("_ValidationScript ...

  5. windows 10 RelativePanel

    The new RelativePanel implements a style of layout that is defined by the relationships between its ...

  6. iOS 内嵌 View 的响应

    遇到一个问题就是我有一个 UITextField,点击后不能编辑而是会显示一个自定义的 dialog. 但发现问题是,UITextField 的对点击事件的反应非常吃顿,有时候好使有时候不好使. 后来 ...

  7. Exp2 后门原理与实践 20164323段钊阳

    220164323 Exp2 后门原理与实践 (1)例举你能想到的一个后门进入到你系统中的可能方式?在使用盗版软件,盗版系统,甚至游戏外挂时,往往会让我们关闭杀毒软件,.(2)例举你知道的后门如何启动 ...

  8. APScheduler定时任务

    python模块(APScheduler定时任务)   APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时 ...

  9. [Flex] 组件Tree系列 —— 运用variableRowHeight和wordWrap设置可变行高

    mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:运用variableRowHeig ...

  10. Android 线刷小白教程

    Android 线刷小白教程 再说一遍,绝不使用刷机精灵等软件. 一.概念 安卓系统一般把rom芯片分成7个区,如果再加上内置sd卡这个分区,就是8个: hboot分区----------负责启动. ...