1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Javascript高级语法11-桥梁模式</title> 6 </head> 7 <body> 8 <script> 9 /*桥梁模式:把将抽象与实现隔离开来,以便两者单独的变化。 10 * 这种模式对于javascript中常见的事件驱动编程有很大好处。 11 */ 12 13 //自己的类库 14 function addEvent(obj,type,fn){ 15 if(obj.addEventListener){ 16 obj.addEventListener(type,fn,false); 17 }else if(obj.attachEvent){ 18 obj["e"+type+fn]=fn; 19 obj[type+fn] = function(){ 20 obj["e"+type+fn](); 21 } 22 obj.attachEvent("on"+type,obj[type+fn]); 23 }else{ 24 obj["on"+type] = obj["e"+type+fn]; 25 } 26 } 27 28 29 30 function demo1(){ 31 //一个页面选择宠物的例子 32 button.addEvent(element,"click",getPetByName); 33 function getPetByName(e){ 34 var id = this.id; 35 asyncRequest("GET","pet.action?id="+id,function(pet){ 36 console.log("request pet" + pet.responseText) 37 }) 38 } 39 /*上面的做法是你在页面有一个按钮,单击会出发后面请求 40 * 如果要进行单元测试:1.用户登录 2.找到你的这个页面 3.单击按钮 41 * 如果需要进行效能层次上的单元测试,是很难进行并发测试的。 42 */ 43 //第二种做法 用简单的桥梁模式来解决 44 function getPetByName(id,callback){ 45 var id = this.id; 46 asyncRequest("GET","pet.action?id="+id,function(pet){ 47 callback(pet); 48 }) 49 } 50 //定义一个桥梁将抽象和实现相互联系在一起 51 addEvent(element,"click",getPetByNameBridge); 52 function getPetByNameBridge(){ 53 getPetByName(this.id,function(pet){ 54 console.log("request pet" + pet.responseText); 55 }) 56 } 57 /*这种做法使API和展现层完全分离 58 * API和展现层可以灵活变动。 59 * 这个模式在Extjs项目开发时候非常的常用。 60 * 61 * 桥梁模式的其他用途: 62 * 特权函数:当你的接口过于复杂的时候,把原本复杂的接口用桥梁的模式抽取出一大部分函数整合起来 63 * 使之客户端更容易的调用。 64 */ 65 66 } 67 // demo1();//demo1是伪代码 demo2是实例 68 69 function demo2(){ 70 // 特权函数 71 var p= function(){ 72 var add=function(){ 73 //进行复杂的数学操作 74 } 75 //这是一个信息全封闭的类,它的内部进行复杂的业务操作 76 //建立一个特权函数,让它调用起来更方便 77 this.bridge = function(){ 78 return { 79 bridgeAdd:function(){ 80 //执行前 81 add(3,3) 82 //执行后 83 } 84 } 85 } 86 } 87 88 //桥梁还可以把多个类进行桥接(链接) 89 var class1 = function(a,b){ 90 this.a = a; 91 this.b = b; 92 } 93 var class2 = function(c,d){ 94 this.c = c; 95 this.d = d; 96 } 97 var bridgeClass = function(){ 98 this.one = new class1(1,2); 99 this.two = new class2(3,4); 100 } 101 /*问,这个理念不是门面模式吗? 102 * 不是,他的目的是在于class1和class2能独立的修改,使之完全松耦合。 103 * 而门面模式的意义在于调用的方便。 104 */ 105 106 } 107 108 </script> 109 </body> 110 </html>