zoukankan      html  css  js  c++  java
  • JavaScript设计模式-12.门面模式

      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>
  • 相关阅读:
    PIL.Image 与 base64互转
    python pytorch ssd网络
    mysql 的左连接、又连接、内连接详细介绍
    base64图片数据类型转numpy的ndarray矩阵类型数据
    kettle学习资料
    kettle 连接 mysql8.0 报错的解决办法 org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the database Error connecting to database: (using class org.gjt.mm.mysql.
    python pandas 自动生成批量测试数据插入数据库 mysql
    finereport点击图表钻取到明细表包括参数传递
    finereport连接mysql8.0的解决办法
    kettle7.0 Windows10 mysql8.0 连接mysql驱动报错,问题解决
  • 原文地址:https://www.cnblogs.com/chengyunshen/p/7191790.html
Copyright © 2011-2022 走看看