博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript组合设模式--改进上述引入的例子
阅读量:6544 次
发布时间:2019-06-24

本文共 2947 字,大约阅读时间需要 9 分钟。

对于组合设计模式:

(1)组合模式中把对象分为两种(组合对象,和叶子对象)  (2)组合对象和叶子对象实现:同一批操作  (3)对组合对象执行的操作可以向下传递到叶子节点进行操作  (4)这样就会弱化类与类之间的耦合  (5)他常用的手法是把对象组合成属性结构的对象 根据组合模式的这些特性我们改写代码如下: 由于用到了接口检验所以我们先引入接口文件代码
//定义一个静态方法来实现接口与实现类的直接检验//静态方法不要写出Interface.prototype ,因为这是写到接口的原型链上的//我们要把静态的函数直接写到类层次上//定义一个接口类var Interface=function (name,methods) {
//name:接口名字 if(arguments.length<2){ alert("必须是两个参数") } this.name=name; this.methods=[];//定义一个空数组装载函数名 for(var i=0;i

(1)统一接口

var composite=new Interface("composite",["getChildByName","add"]);//侧重点获取子    var student=new Interface("composite",["goToClass","finishClass"]);//侧重点为每个对象的实现

(2)定义组合类

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

(3)定义叶子类

var studentObj=function (name) {        this.name=name;        this.type="student";//默认是叶子        //得到所有孩子节点      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 +" 去上课
"); } //下课 this.finishClass = function(name){ document.write(this.name +" 下课
"); } Interface.ensureImplement(this,composite,student); }

(4)应用---将学校,班级,组,学生关联起来

var  astudent=new studentObj("我是a同学");    var  bstudent=new studentObj("我是b同学");    var  cstudent=new studentObj("我是c同学");    var  dstudent=new studentObj("我是d同学");    var  estudent=new studentObj("我是e同学");    var  fstudent=new studentObj("我是f同学");    var  gstudent=new studentObj("我是g同学");    var  hstudent=new studentObj("我是h同学");    var  istudent=new studentObj("我是i同学");    var one = new compositeObj("一班");    var oneOne = new compositeObj("一班一组");    oneOne.add(astudent).add(bstudent);    var oneTwo = new compositeObj("一班二组");    oneTwo.add(cstudent).add(dstudent);    one.add(oneOne).add(oneTwo);    var two = new compositeObj("二班");    var twoOne = new compositeObj("二班一组");    twoOne.add(estudent).add(fstudent);    var twoTwo = new compositeObj("二班二组");    twoTwo.add(gstudent).add(hstudent).add(istudent)    two.add(twoOne).add(twoTwo);    var usPcat = new compositeObj("组合设计模式培训学校");    usPcat.add(one).add(two);

(5)客户端调用API,只需要简单的安排去上课即可,也就是客户端只需要写去上课的代码即可

 
usPcat.goToClass();    document.write("-------------------------
"); usPcat.goToClass("一班"); document.write("-------------------------
"); usPcat.goToClass("二班一组");
 

总结,

 
posted on
2017-10-18 22:30 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/wfaceboss/p/7689497.html

你可能感兴趣的文章
virtualbox for fedora 15启动失败解决
查看>>
Linux进程的Uninterruptible sleep(D)状态
查看>>
Kubernetes 资源管理概述
查看>>
E. Stripies
查看>>
邮箱域名解析IP一致性
查看>>
讨论一下云计算企业管理系统优势是什么
查看>>
多校9 1007 Travelling Salesman Problem
查看>>
三个重要的事件来看软件测试的重要性和软件测试的行情
查看>>
机器学习--决策树
查看>>
自定义条件判断两对象相等Equals的方法
查看>>
Dev GridControl 选择行及绑定/获取List对象
查看>>
ecshop新建增加独立页面的方法
查看>>
MyBatis 传参取不到属性的问题
查看>>
mysql修改用户密码
查看>>
表单提交:button input submit 的区别
查看>>
徐万新-英文自我介绍
查看>>
HTML/CSS/JS编码规范
查看>>
LaTex in Markdown
查看>>
上传文件
查看>>
windows下根据端口找pid
查看>>