<!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. 深海划水队项目---七天冲刺day2

    上完选修后的站立式会议: 工作进度 昨天已完成的工作: 这周任务分配,每日任务要求. 今天计划完成的工作: 推进开发进度,进一步理清开发思路. 工作中遇到的困难: 站立式会议好难统一时间啊. 燃尽图 ...

  2. 咏南CS开发框架新的界面风格

    咏南CS开发框架新的界面风格 这种风格完全和WINDOWS桌面一样,符合用户的操作习惯. 我的桌面的图标和WINDOWS桌面一样分为二类:1)快捷方式  2)文件夹. 如果快捷方式较多,看得人眼花缭乱 ...

  3. 2.自己的Github注册流程

    一开始申请Github,说实话我真的不知道它是什么东西,而且有什么用途.然后我就用360百科搜索了一下有关它的介绍:. 而说明的是Git是一个分布式的版本控制系统.然后我进入官方网站进行账号注册,而注 ...

  4. linux中执行java或者mvn命令提示没有权限解决办法

    $ chmod a+x /var/jenkins_home/jdk1.8.0_191/bin/java $ chmod a+x /var/jenkins_home/apache-maven-3.3.9 ...

  5. autofac JSON文件配置

    autofac是比较简单易用的IOC容器.下面我们展示如何通过json配置文件,来进行控制反转. 需要用到以下程序集.可以通过nugget分别安装 Microsoft.Extensions.Confi ...

  6. LightOJ 1213 Fantasy of a Summation(规律 + 快数幂)

    http://lightoj.com/volume_showproblem.php?problem=1213  Fantasy of a Summation Time Limit:2000MS     ...

  7. 【12c OCP】CUUG OCP认证071考试原题解析(34)

    34.choose two View the Exhibit and examine the structure of the PRODUCT_INFORMATION and INVENTORIES ...

  8. CF1110G Tree-Tac-Toe(博弈论)

    题面 传送门 题解 博弈论的前提是双方都是绝顶聪明的人 所以这种题目显然不是我应该做的 题解 //minamoto #include<bits/stdc++.h> #define R re ...

  9. 3. STL编程三

    1. 算法容器的使用: #include <iostream> #include <functional> #include <vector> #include & ...

  10. 老男孩Day12作业:RabbitMQ-RPC版主机管理程序

    一.作业需求 1.可以对指定机器异步的执行多个命令 例子: 请输入操作指令>>>:run ipconfig --host 127.0.0.0 in the call     tack ...