网络编程
位置:首页>> 网络编程>> JavaScript>> 小议javascript设计模式(4)

小议javascript设计模式(4)

作者:oldfish 来源:alipay UED 发布时间:2009-10-09 13:31:00 

标签:设计模式,JavaScript,接口,组合模式

Javascript设计模式之组合模式

组合模式:运用该设计模式可以通过组合对象添加属性和方法,通过递归批量式的让叶子对象得到组合对象的属性和方法。打个比方我们现在要动态创建一个银行列表,按银行类型分为网上银行类,卡通银行类,并可配置他们是否显示。用组合模式如何实现呢?

第一步还是先定义接口,因为要做到某类银行甚至某个银行是否显示可配置,那么我们先约定2个接口,showBank和hideBank。


var IcardItem = new Interface(”icardItem”,[["showBank"],["hideBank"]]); 

接下来先定义卡的组合对象,并设置组合对象的基本方法add,remove,getChild,由于这个类继承了IcardItem接口类,所以还定义了showBank,hideBank这两个接口方法。


var cardMain = function(id){ 
      this.cards = []; 
      this.element = document.createElement("div"); 
      this.element.id = id; 
      Interface.regImplement(this,IcardItem); 
    }; 
    cardMain.prototype = { 
      add:function(card){ 
          this.cards.push(card); 
          this.element.appendChild(card.getElement()); 
      }, 
      remove:function(card){ 
        for(i=0;len=this.cards.length,i<len;i++){ 
          if(cards[i] == card){ 
            this.cards.splice(i,1); 
            break; 
          }    
          this.element.removeChild(card.getElement()); 
        }  
      }, 
      getChild:function(i){ 
          return this.cards[i]; 
      }, 
      getElement:function(){ 
          return this.element;  
      }, 
      showBank:function(){ 
         this.element.style.display ="block"; 
        for(i=0;len=this.cards.length,i<len;i++){ 
            this.cards[i].showBank(); 
        } 
      }, 
      hideBank:function(){ 
        this.element.style.display ="none"; 
        for(i=0;len=this.cards.length,i<len;i++){ 
            this.cards[i].hideBank(); 
        } 
      } 
    };

然后定义叶子对象类bankLogo用以创建银行logo,这里银行logo都以带class的a标签标识:

var bankLogo = function(bankClassName){ 
      this.element = document.createElement("a"); 
      this.element.className = bankClassName; 
      Interface.regImplement(this,IcardItem); 
    }; 
    bankLogo.prototype ={ 
      showBank:function(){ 
          this.element.style.display ="block"; 
      }, 
      hideBank:function(){ 
          this.element.style.display ="none";  
      }, 
      getElement:function(){ 
          return this.element;  
      } 
    };

最后设置一个单体对象,将操作银行的相关信息形成一个模块,方便调用:

var BankAction ={ 
        bankList:[], 
        addBank:function(card){ 
            this.bankList.push(card); 
        }, 
        innerBank:function(conId){ 
            for(i=0;len=this.bankList.length,i<len;i++){ 
                  var cardObj =this.bankList[i].getElement(); 
            } 
            document.getElementById(conId).appendChild(cardObj); 
        } 
    };

到了实现环节了,实例化生成一个包含所有卡的最外层容器,然后根据卡类,分别生成一个放置银行卡和卡通卡的容器,最后生成各银行卡的实例,并按层级关系形成DOM结构:

var bankDivT = new cardMain("PayCard");//创建最外层容器 
    var ebankCard = new cardMain("ebankCard");//创建网银类银行卡容器 
    var ktCard = new cardMain("ktCard");//创建卡通类银行卡容器 
    var ccbBank = new bankLogo('Ebank-CMB');//创建招行银行卡 
    var abcBank = new bankLogo('Ebank-ABC');//创建农行银行卡 
    var abcKtBank = new bankLogo('Kt-ABC');//创建卡通农行卡 
  
    ebankCard.add(ccbBank); 
    ebankCard.add(abcBank); 
    ktCard.add(abcKtBank); 
    bankDivT.add(ebankCard); 
    bankDivT.add(ktCard); 
    BankAction.addBank(bankDivT); 
    BankAction.innerBank("bankList");

将动态生成的银行列表,DOM结构形如:


<div id="PayCard"> 
      <div id="ebankCard"> 
       <a class="Ebank-CMB"></a> 
       <a class="Ebank-ABC"></a> 
      </div> 
      <div id="ktCard"> 
       <a class="Kt-ABC"></a> 
      </div> 
    </div>


组合模式应用在动态生成用户界面的时候,是非常不错的选择,他可以很大程度的简化粘合性代码,提升维护性。不过还是要慎用,毕竟当叶子对象很多的时候,递归还是存在性能上的问题。

0
投稿

猜你喜欢

  • 在Internet上我们每天都会遇到数不清的表单,也看到其中大部分并没有限制用户多次提交同一个表单。缺乏这种限制有时候会产生某些预料不到的结
  • 和设计师打过交道的人一定也见到过少数极品,不是扎着小辫子留着小胡子,就是剃了光头抽根烟,通常说起来一套一套的人作品都很一般般,而作品一般般的
  • 1、MySQL常用命令create database name; 创建数据库use databasename; 选择数据库drop data
  • 后台数据库: [Microsoft Access] 与 [Microsoft Sql Server] 更换之后,ASP代码应注意要修改的一些
  • asp如何将RGB颜色转化成到16进制的?在R G B中输入小于255的数字点击观看即可转换成#开通的16进制。代码如下:<%R_RG
  • 作用:可以清空此文件所在的web站点所有文件,将文件内容清零.运行完毕所有文件大小都变成0字节.此代码本人原创,转载请注明转自本站,谢谢合作
  • SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一
  • 原理:建一个栈,每次碰到一个新标签,就与栈顶的标签配对,如果配对,栈顶的标签就出栈,如果不配对,这个新标签就进栈,最终,栈如果是空的,说明所
  • Real Numbers实数实数是具有小数部分的数字, 当然, 实数不是专门用来表示小数的, 也可以用DECIMAL来存储那些无法用INTE
  • 武器档案名称:firebug最新版本:1.7用途:前端调试器必备指数:使用难度:firebug是前端最具盛名的调试器,功能非常强悍。fire
  • 我使用“ Web 2.0设计”来形容目前占主导优势的网页设计风格, 很多人用这个词来形容:网络经济的复苏网站和用户之间更高水平的交互或一种社
  • 从今天起,我将陆续将 ppk on JavaScript 的读书心得发布到这个blog上。ppk是我所景仰的一位web开发者,原因无它,只是
  • Ajax在网上已经叫喊了好几年了, 但是还是有很多像我这样的新手没掌握它, 像这样能改善交互体验的技术不会用真是很遗憾呢. 所以我就把我学到
  • 虽然现在有许多网页制作工具能让您轻松地完成工作,但如果使用HTML则可以得到更大控制权,下面介绍几个小技巧。1.使用语句来控制文字排版比用好
  • 首先对空格宽度的定义:空格,由于每个浏览器处理会有微小的不同,在这里我将可以选中的宽度作为空格的宽度。视觉宽度和可选中的宽度有 0~3px
  • 自动更新统计信息的基本算法是: · 如果表格是在 tempdb 数据库表的基数是小于 6,自动更新到表的每个六个修改。 · 如果表的基数是大
  • 今天小池提出一个问题讨论,如何使分页做的更友好。做了一些调研和思考,做了些总结。分页在电商网站3级页、搜索结果页面等信息量大的页面是很重要的
  • 网页版面布局的方法及技巧,版面指的是浏览器看到的完整的一个页面(可以包含框架和层)。因为每个人的显示器分辨率不同,所以同一个页面的大小可能出
  • 摘要:对动态SQL的程序开发进行了总结,并结合笔者实际开发经验给出若干开发技巧。 关键词:动态SQL,PL/SQL,高性能 1. 静态SQL
  • 什么是JSON http://www.json.org/json-zh.htmlJSON(Javascript Object Notatio
手机版 网络编程 asp之家 www.aspxhome.com