1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript高级语法12-门面模式</title> 6 </head> 7 <body> 8 <a id="btn" href="#">click</a> 9 <script> 10 /*用途比较广,通过一个简单的例子引出门面模式 11 * 简化类的接口体现门面的好处。 12 * 13 * 门面模式作用:1.简化类的接口 2.消除类和使用本类的客户端的代码耦合 14 * 3.通过构建一个简单的门面代码让系统变得更简单 15 */ 16 function demo1(){ 17 /*各种浏览器对于DOM事件的注册是不一样的(那么每一个浏览器会被看成一个子系统) 18 程序员如果天天和这些问题打交道的话,那么重点就偏离了原本的业务 19 * */ 20 function addEventFacade(el,type,fn){ 21 if(window.addEventListener){ 22 //使用火狐浏览器 23 el.addEventListener(type,fn,false); 24 }else if(window.attachEvent){ 25 //适用于IE的 26 el.attachEvent("on"+type,fn); 27 }else{ 28 el["on"+type] = fn; 29 } 30 } 31 var ele = document.getElementById("btn"); 32 addEventFacade(ele,"click",function(){ 33 alert("ok"); 34 }) 35 36 } 37 // demo1(); 38 39 //接口 40 var Interface = function(name,methods){ 41 if(arguments.length != 2){ 42 alert("interface must have two paramters..."); 43 } 44 this.name = name;//这个是接口的名字 45 this.methods = [];//定义个空数组来转载函数名 46 for (var i = 0; i < methods.length; i++) { 47 if(typeof methods[i] != "string"){ 48 alert("method name must is String ...") 49 }else{ 50 this.methods.push(methods[i]) 51 } 52 } 53 } 54 //定义接口的一个静态方法来实现接口与实现类的直接检验 55 //静态方法不要写成Interface.prototype.* 因为这是写到接口原型连上的 56 //我们要把静态的函数直接写到类层次上 57 Interface.ensureImplements = function(object){ 58 if(arguments.length<2){ 59 alert("必须最少是2个参数"); 60 return false; 61 } 62 //遍历 63 for (var i = 1; i < arguments.length; i++) { 64 var inter = arguments[i]; 65 //如果你是接口就必须是Interface类型的 66 if(inter.constructor != Interface){ 67 throw new Error("if is interface class must is Interface type"); 68 } 69 //遍历函数集合并分析 70 for (var j = 0; j < inter.methods.length; j++) { 71 var method = inter.methods[j]; 72 //实现类中必须有方法名字 和 接口中所有的方法名项目 73 if(!object[method] || typeof object[method] != "function"){ 74 throw new Error("实现类并且没有完全实现接口中的所有方法..."); 75 } 76 } 77 } 78 } 79 function demo2(){ 80 /*用2个DAO体现门面模式 81 */ 82 //人员类 83 var PersonDao = new Interface("PersonDao",["getInfo","learn","merry"]); 84 var Person = function(){ 85 this.name = "zhangsan"; 86 this.address = "beijing"; 87 this.getInfo = function(){ 88 return "名字"+this.name+" 地址"+this.address; 89 } 90 this.learn = function(){ 91 document.write("学习"); 92 } 93 this.merry = function(){ 94 } 95 //验证实现的接口 96 Interface.ensureImplements(this,PersonDao); 97 } 98 //dog Dao 99 var DogDao = new Interface("DogDao",["call","run","getInfo"]); 100 var Dog = function(){ 101 this.name = "dahuang"; 102 this.getInfo = function(){ 103 return "狗的名字:"+this.name; 104 } 105 this.run = function(){} 106 this.call = function(){} 107 //验证接口 108 Interface.ensureImplements(this,DogDao); 109 } 110 //需求是现在需要给养的狗办理相应的宠物领养证件。需要人和狗的信息 111 //1.不用门面 112 function action(person,dog){ 113 var r = "GG" + new Date().getDate() + Math.floor(Math.random()*11); 114 var str = "办证成功:编号" +r + "<br>主人信息:"+person.getInfo()+"<br>狗的信息"+ 115 dog.getInfo(); 116 document.write(str); 117 } 118 //action(new Person(),new Dog()); 119 120 //使用门面模式 复杂的事 交给门面来做 121 function facade(person,dog){ 122 var r = "GG" + new Date().getDate() + Math.floor(Math.random()*11); 123 var str = "办证成功:编号" +r + "<br>主人信息:"+person.getInfo()+"<br>狗的信息"+dog.getInfo(); 124 this.action = function(){ 125 return str; 126 } 127 128 } 129 130 function action2(person,dog){ 131 document.write(new facade(person,dog).action()); 132 } 133 action2(new Person(),new Dog()); 134 135 //用了门面模式,客户端代码变得简单了。 136 } 137 demo2(); 138 </script> 139 </body> 140 </html>