组合模式笔记

组合模式又称部分-整体模式,将对象组合成树形结构以表示'部分整体'的层次结构

组合模式使得用户对单个对象和组合对象的使用具有一致性

demo实例 :表单模块

要调用到前面学习到的寄生组合继承方法

             //原型式继承
function inheritobject(o){
//声明一个过渡函数对象
function F(){
}
//过渡原型对象继承父对象
F.prototype=o;
//返回过渡对象的一个实列,该实例的原型继承了父对象
return new F();
}
/*
*寄生式继承 继承原型
* 传递参数subclass 子类
* 传递参数superclass 父类
* */
function inheritPrototype(subclass,superclass){
//复制一份父类的原型副本保存在变量中
var p=inheritobject(superclass.prototype);
//修正因为重写子类原型导致子类的constructor属性被修改
p.constructor=subclass;
//设置子类原型
subclass.prototype=p;
}

表单 demo

1.表单虚拟父类 Base

            //表单虚拟父类 Base
var Base = function(){
this.children = [];
this.element = null;
};
Base.prototype = {
init : function(){
throw new Error("请重写你的方法");
},
add : function(){
throw new Error("请重写你的方法");
},
getElement : function(){
throw new Error("请重写你的方法");
}
};

2.FormItem容器类

           //FormItem
var FormItem = function(id,parent){
Base.call(this);
this.id = id;
this.parent = parent;
this.init();
};
inheritPrototype(FormItem,Base);
FormItem.prototype = {
init : function(){
this.element =document.createElement('form');
this.element.id=this.id;
this.element.className='new-form';
},
add : function(child){
this.children.push(child);
this.element.appendChild(child.getElement());
return this;
},
getElement : function(){
return this.element;
},
show : function(){
this.parent.appendChild(this.element);
}
};

3.FieldsetItem类

             //FieldsetItem
var FieldsetItem = function(classname,legend){
Base.call(this);
this.classname=classname || '';
this.legend=legend;
this.init();
};
inheritPrototype(FieldsetItem,Base);
FieldsetItem.prototype = {
init : function(){
this.element = document.createElement('fieldset');
var legendname = document.createElement('legend');
legendname.innerHTML = this.legend;
this.element.appendChild(legendname);
this.element.className='new-fieldset';
},
add : function(child){
this.children.push(child);
this.element.appendChild(child.getElement());
return this;
},
getElement : function(){
return this.element;
},
};

4.Group类

            var Group = function(){
Base.call(this);
this.init();
};
inheritPrototype(Group,Base);
Group.prototype = {
init : function(){
this.element = document.createElement('div');
this.element.className='group';
},
add : function(child){
this.children.push(child);
this.element.appendChild(child.getElement());
return this;
},
getElement : function(){
return this.element;
}
};

5.InputItem

             //InputItem
var InputItem = function(name){
Base.call(this);
this.classname = name;
this.id = name;
this.init();
};
inheritPrototype(InputItem,Base);
InputItem.prototype = {
init : function(){
this.element = document.createElement('input');
this.element.className=this.classname;
this.element.id=this.id;
},
add : function(){ },
getElement : function(){
return this.element;
}
};

6.LabelItem类

             //LabelItem
var LabelItem = function(name,nameText){
Base.call(this);
this.text = nameText;
this.name = name;
this.init();
};
inheritPrototype(LabelItem,Base);
LabelItem.prototype = {
init : function(){
this.element = document.createElement('label');
this.element.name=this.name;
this.element.innerHTML=this.text;
},
add : function(){ },
getElement : function(){
return this.element;
}
};

7.SpanItem类

             //SpanItem
var SpanItem = function(warntext){
Base.call(this);
this.text = warntext;
this.init();
};
inheritPrototype(SpanItem,Base);
SpanItem.prototype = {
init : function(){
this.element = document.createElement('span');
this.element.innerHTML=this.text;
},
add : function(){ },
getElement : function(){
return this.element;
}
};

测试代码

             var form =new FormItem('FormItem',document.body);
form.add(
new FieldsetItem('account','账号').add(
new Group().add(
new LabelItem('uname','用户名:')
).add(
new InputItem('uname')
).add(
new SpanItem('4到6位数字或字母')
)
).add(
new Group().add(
new LabelItem('pwd','密&nbsp码:')
).add(
new InputItem('pwd')
).add(
new SpanItem('6到12位数字或字母')
)
)
).add(
new FieldsetItem('info','信息').add(
new Group().add(
new LabelItem('name','昵称:')
).add(new InputItem('name'))
).add(
new Group().add(
new LabelItem('status','状态:')
).add(
new InputItem('status')
)
)
).show();

浏览器显示

生成的html代码

javascript-组合模式的更多相关文章

  1. 轻松掌握:JavaScript组合模式

    组合模式 组合模式:将一组对象组合成树形结构,并统一对待组合对象和叶对象,忽略它们之间的不同(因为叶对象也可以也可以包含叶对象而成为组合对象),组合模式中的对象只能是一对多的关系,不能出现多对一. 基 ...

  2. JavaScript组合模式---引入

    首先:使用一个例子来引入组合模式,需求为(1)有一个学校有2个班(一班,二班)(2)每个班级分2个小组(一班一组,一班二组,二班一组,二班二组)(3)学校计算机教室有限,每一个小组分着来上课 然后:根 ...

  3. [设计模式] javascript 之 组合模式

    组合模式说明 组合模式用于简单化,一致化对单组件和复合组件的使用:其实它就是一棵树: 这棵树有且只有一个根,访问入口,如果它不是一棵空树,那么由一个或几个树枝节点以及子叶节点组成,每个树枝节点还包含自 ...

  4. javascript设计模式学习之十——组合模式

    一.组合模式定义及使用场景 组合模式将对象组合成树形结构,用以表示“部分—整体”的层次结构,除了用来表示树形结构之外,组合模式还可以利用对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性. ...

  5. javascript设计模式-组合模式

    组合模式所要解决的问题: 可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象. 客户端代码必须区别对象简单对象和 ...

  6. JavaScript高级---组合模式设计

    一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...

  7. 读书笔记之 - javascript 设计模式 - 组合模式

    组合模式是一种专为创建Web上的动态用户界面而量身定制的模式,使用这种模式,可以用一条命令在对各对象上激发复杂的或递归的行为. 在组合对象的层次体系中有俩种类型对象:叶对象和组合对象.这是一个递归定义 ...

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

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

  9. javascript设计模式——组合模式

    前面的话 在程序设计中,有一些和“事物是由相似的子事物构成”类似的思想.组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的.本文将详细介绍组合模式 宏命令 宏 ...

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

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

随机推荐

  1. ASP.NET Web API 路由对象介绍

    ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...

  2. 我所理解的SOA和微服务

    本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...

  3. ABP(现代ASP.NET样板开发框架)系列之19、ABP应用层——审计日志

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之19.ABP应用层——审计日志 ABP是“ASP.NET Boilerplate Project (ASP.NET ...

  4. Math.abs()方法 取绝对值

    定义和用法 abs() 方法可返回数的绝对值. 语法 Math.abs(x) 参数 描述 x 必需.必须是一个数值. 返回值 x 的绝对值. 实例 在本例中,我将取得正数和负数的绝对值: <sc ...

  5. Vuex2.0+Vue2.0构建备忘录应用实践

    一.介绍Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,适合于构建中大型单页应用. ...

  6. .NET Core的文件系统[1]:读取并监控文件的变化

    ASP.NET Core 具有很多针对文件读取的应用.比如我们倾向于采用JSON文件来定义配置,所以应用就会涉及针对配置文件读取.如果用户发送一个针对物理文件的HTTP请求,应用会根据指定的路径读取目 ...

  7. MVC默认路由实现分页-PagerExtend.dll

    这两天在群里有人咨询有没有现成的.net mvc分页方法,由此写了一个简单分页工具,这里简单分享下实现思路,代码,希望能对大家有些帮助,鼓励大家多造些轮子还是好的. A.效果(这里用了bootstra ...

  8. ashx中Response.ContentType的常用类型

    ashx中Response.ContentType的常用类型: text/plaintext/htmltext/xmlapplication/jsonimage/GIFapplication/x-cd ...

  9. 9.JAVA之GUI编程列出指定目录内容

    代码如下: /*列出指定目录内容*/ import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import ...

  10. 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...