JavaScript组合模式---引入
首先:
使用一个例子来引入组合模式,需求为
(1)有一个学校有2个班(一班,二班)
(2)每个班级分2个小组(一班一组,一班二组,二班一组,二班二组)
(3)学校计算机教室有限,每一个小组分着来上课 然后:根据需求我们可以简单看出这里面涉及到 学校,班级,组,和学生总共4个类
使用程序模拟 这4个类为,
(1)学校类
var school=function (name) {
this.name=name;
var classes=new Array();
this.addClasses=function (cla) {
classes.push(classe);
}
this.getClass=function () {
return classes;
}
}
(2)班级类
//班级类
var classes=function (name) {
this.name = name;
var groups = new Array();
this.addGroup = function (group) {
groups.push(group);
return this;
};
this.getGroups = function () {
return groups;
}
};
(3)组类
//组
var group=function (name) {
this.name=name;
var students=new Array();
var addStudents=function (student) {
students.push(student);
return this;
}
this.geStudent=function () {
return students;
}
};
(4)学生类
//学生类
var student=function (name) {
this.name=name;
this.gotoClass=function () {
document.write(name+":我是学生,我要去上课 ")
};
this.finishClass=function () {
document.write(name+": 终于下课了");
}
};
其次,测试需满足如下为:
(1)每个班级分2个小组(一班一组,一班二组,二班一组,二班二组)
(2)学校计算机教室有限,每一个小组的学生分着来上课
(3)现在我们倒着写,从学生-->组->班级-->学校
//学生实例
var astudent=new student("我是a同学");
var bstudent=new student("我是b同学");
var cstudent=new student("我是c同学");
var dstudent=new student("我是d同学");
var estudent=new student("我是e同学");
var fstudent=new student("我是f同学");
var gstudent=new student("我是g同学");
var hstudent=new student("我是h同学");
var istudent=new student("我是i同学");
//班级实例(1)
var class1=new classes("一班");
//组1
var oneOne=new group("一班一组");
//组中添加学生
oneOne.addStudents(astudent).addStudents(bstudent);
//组2
var oneTwo=new group("一班二组");
//组中添加学生
oneTwo.addStudents(cstudent).addStudents(dstudent); class1.addGroup(oneOne).addGroup(oneTwo);
//班级实例2
var class2=new classes("二班");
//组1
var towOne=new group("二班一组");
//组中添加学生
towOne.addStudents(estudent).addStudents(fstudent); //组2
var towTwo=new group("二班二组");
//组中添加学生
towTwo.addStudents(gstudent).addStudents(hstudent).addStudents(istudent);
//
class2.addGroup(towOne).addGroup(towTwo);
//学校实例
var usSchool=new school("组合模式学校");
最后,开学了,我们准备按照要求去上课吧,
安排为:一班一组去上课 学校-->班级-->组-->学生
var classes=usSchool.getClass();//班级
for(var i=;i<classes.length;i++){
if(classes[i].name=="一班"){
for(var j=;j<classes[i].getGroups().length;j++){
if(classes[i].classes[i].getGroups()[j]=="一组"){
var students=classes[i].classes[i].getGroups()[j].geStudent();
for(var k=;k<students.length;k++){
students[k].gotoClass();
}
}
}
}
}
最后,我只是想安排一个都要写这么多的代码,那如何是一个学校有上千个班级,那么要疯了。
这种一定不适合业务的扩展,为此我们使用组合模式来解决上述的问题。
为啥要用设计模式呢?
因为设计模式有如下的一些操作方式:
(1)组合模式中把对象分为两种(组合对象,和叶子对象)
(2)组合对象和叶子对象实现:同一批操作
(3)对组合对象执行的操作可以向下传递到叶子节点进行操作
(4)这样就会弱化类与类之间的耦合
(5)他常用的手法是把对象组合成属性结构的对象
请开阅读下篇:JavaScript组合设模式--改进上述引入的例子
JavaScript组合模式---引入的更多相关文章
- 轻松掌握:JavaScript组合模式
组合模式 组合模式:将一组对象组合成树形结构,并统一对待组合对象和叶对象,忽略它们之间的不同(因为叶对象也可以也可以包含叶对象而成为组合对象),组合模式中的对象只能是一对多的关系,不能出现多对一. 基 ...
- JavaScript组合设模式--改进上述引入的例子
对于组合设计模式: (1)组合模式中把对象分为两种(组合对象,和叶子对象) (2)组合对象和叶子对象实现:同一批操作 (3)对组合对象执行的操作可以向下传递到叶子节点进行操作 (4)这样就会弱化类与类 ...
- javascript设计模式——组合模式
前面的话 在程序设计中,有一些和“事物是由相似的子事物构成”类似的思想.组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的.本文将详细介绍组合模式 宏命令 宏 ...
- JavaScript设计模式之----组合模式
javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...
- [设计模式] javascript 之 组合模式
组合模式说明 组合模式用于简单化,一致化对单组件和复合组件的使用:其实它就是一棵树: 这棵树有且只有一个根,访问入口,如果它不是一棵空树,那么由一个或几个树枝节点以及子叶节点组成,每个树枝节点还包含自 ...
- javascript设计模式学习之十——组合模式
一.组合模式定义及使用场景 组合模式将对象组合成树形结构,用以表示“部分—整体”的层次结构,除了用来表示树形结构之外,组合模式还可以利用对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性. ...
- javascript设计模式-组合模式
组合模式所要解决的问题: 可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象. 客户端代码必须区别对象简单对象和 ...
- JavaScript高级---组合模式设计
一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...
- 读书笔记之 - javascript 设计模式 - 组合模式
组合模式是一种专为创建Web上的动态用户界面而量身定制的模式,使用这种模式,可以用一条命令在对各对象上激发复杂的或递归的行为. 在组合对象的层次体系中有俩种类型对象:叶对象和组合对象.这是一个递归定义 ...
随机推荐
- HDFS数据完整性
数据完整性 Hadoop用户肯定都希望系统在存储和处理数据时不会丢失或损坏任何数据.尽管磁盘或网络上的每个I/O操作不太可能将错误引入自己正在读/写的数据中,但是如果系统中需要处理的数据量大到Hado ...
- 循环插入一条数据的sql写法
DECLARE @i INTSET @i = 1WHILE @i > 0 BEGIN DECLARE @TransportFormMstID BIGINT; DECLARE @TradeOrde ...
- 使用Jenkins进行持续集成
首先,我们从Jenkins官方网站https://jenkins.io/下载最新的war包.虽然Jenkins提供了Windows.Linux.OS X等各种安装程序,但是,这些安装程序都没有war包 ...
- Redis 创建多个端口
默认的是6379 可以用6380,6381开启多个 1.开启 ./redis-server ../etc/redis.6380.conf & 2.链接 redis-cli -p 6380 查看 ...
- 调试OpenStack时遇到的主要问题(by quqi99)
作者:张华 发表于:2014-11-09版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 今天想 ...
- PHP的目录路径问题
在windows下,可以用“/”或者“\”来表示目录层次,而linux下只能用“/”:同时在linux下没有盘符的概念,只有用“/”符号表示唯一的根目录.所以,用一个变量表示目录位置的话,用“/”最安 ...
- DataSet.WriteXml()
枚举通常是作为 DataSet.WriteXml() 方法的第二个参数使用.它决定使用哪种格式保存XML: IgnoreSchema --默认值.只写数据集的数据,不带有任何架构信息.如果数据集内无数 ...
- css3——transition属性和opacity属性
[transition-duration] 是一个css3属性,规定完成过度效果需要花费的时间(一秒或毫秒计).语法:transition-duration: time;time : 规定完成过 ...
- 机器学习(二)—支持向量机SVM
1.SVM的原理是什么? SVM是一种二类分类模型.它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器.(间隔最大是它有别于感知机) 试图寻找一个超平面来对样本分割,把样本中的正例和反例 ...
- 解决:Python爬取https站点时SNIMissingWarning和InsecurePlatformWarning
今天想利用Requests库爬取糗事百科站点,写了一个请求,却报错了: 后来参考kinsomy的博客,在cmd中pip install pyopenssl ndg-httpsclient pyasn1 ...