zoukankan      html  css  js  c++  java
  • JavaScript设计模式-19.代理模式

      1 <!DOCTYPE html>
      2 <html>
      3     <head>
      4         <meta charset="UTF-8">
      5         <title>javascript高级语法19-代理模式</title>
      6     </head>
      7     <body>
      8         <script>
      9             /*代理是一个对象(proxy),用它来控制对 目标对象的访问
     10              * 他要实现与目标对象相同的接口,但不同于装饰者模式。
     11              * 它对目标对象不进行任何修改。
     12              * 它的目的在于:延缓复杂对象的初始化时间,
     13              * 这样可以再用刀这个目标对象的时候再初始化它。
     14              * (对于单例来讲,更是重要。)
     15              */        
     16             function demo1(){
     17                 //图书类
     18                 var Book = function(id,name,price){
     19                     this.id = id;
     20                     this.name = name;
     21                     this.price = price;
     22                 }
     23                 //目标类
     24                 var myBookShop = (function(){
     25                     //书店里的书
     26                     var books = {}
     27                     return function(bks){
     28                         if(typeof bks == "object"){
     29                             books = bks;
     30                         }
     31                         //加书
     32                         this.addBook = function(book){
     33                             books[book.id] = book;
     34                         }
     35                         this.findBook = function(bid){
     36                             //这块后边用责任链模式改写。
     37                             if(books[bid]){
     38                                 return books[bid];
     39                             }else{
     40                                 return null;
     41                             }    
     42                         }
     43                         this.returnBook = function(book){
     44                             this.addBook(book);
     45                         }    
     46                         this.checkBook = function(bid){
     47                             var book = this.findBook(bid);
     48                             return book;
     49                         }
     50 //                        Interface.ensureImplements(this,bookShop);
     51                     }
     52                 })();
     53                 
     54                 // 普通代理:没什么意义,一般不用
     55                 var myBookShopProxy = function(bks){
     56                     var obj = new myBookShop(bks);
     57                     //加书
     58                     this.addBook = function(book){
     59                         obj.addBook(book);
     60                     }
     61                     this.findBook = function(bid){
     62                         return obj.findBook(bid);
     63                     }
     64                     this.returnBook = function(book){
     65                          obj.returnBook(book);
     66                     }    
     67                     this.checkBook = function(bid){
     68                         return obj.checkBook(bid);
     69                     }    
     70                 }
     71                 
     72                 var proxy = new myBookShopProxy({
     73                     "001":new Book("001","extjs","45"),
     74                     "002":new Book("002","javascript","22")
     75                 })
     76                 alert(proxy.checkBook("002").name);
     77                 /*这个代理是严格按照定义来写的
     78                  * 一般开发中不会用到,没什么意义
     79                 */
     80             }
     81 //            demo1();
     82 
     83             //惰性代理
     84             function demo2(){
     85                 //图书类
     86                 var Book = function(id,name,price){
     87                     this.id = id;
     88                     this.name = name;
     89                     this.price = price;
     90                 }
     91                 //目标类
     92                 var myBookShop = (function(){
     93                     //书店里的书
     94                     var books = {}
     95                     return function(bks){
     96                         if(typeof bks == "object"){
     97                             books = bks;
     98                         }
     99                         //加书
    100                         this.addBook = function(book){
    101                             books[book.id] = book;
    102                         }
    103                         this.findBook = function(bid){
    104                             //这块后边用责任链模式改写。
    105                             if(books[bid]){
    106                                 return books[bid];
    107                             }else{
    108                                 return null;
    109                             }    
    110                         }
    111                         this.returnBook = function(book){
    112                             this.addBook(book);
    113                         }    
    114                         this.checkBook = function(bid){
    115                             var book = this.findBook(bid);
    116                             return book;
    117                         }    
    118 //                        Interface.ensureImplements(this,bookShop);
    119                     }
    120                 })();
    121                 
    122                 //惰性代理
    123                 var myBookShopProxy = function(bks){
    124                     var obj = null;
    125                     this._init = function(){
    126                         alert("这时候初始化本类");
    127                         obj = new myBookShop(bks);
    128                     }
    129                     //加书
    130                     this.addBook = function(book){
    131                         this._init();
    132                         obj.addBook(book);
    133                     }
    134                     this.findBook = function(bid){
    135                         this._init();
    136                         return obj.findBook(bid);
    137                     }
    138                     this.returnBook = function(book){
    139                         this._init();
    140                          obj.returnBook(book);
    141                     }    
    142                     this.checkBook = function(bid){
    143                         this._init();
    144                         return obj.checkBook(bid);
    145                     }    
    146                     
    147                 }
    148                 var proxy = new myBookShopProxy({
    149                     "001":new Book("001","extjs","45"),
    150                     "002":new Book("002","javascript","22")
    151                 })
    152                 alert(proxy.checkBook("001").name);    
    153                 
    154                 //调用方法的时候,才会初始化本类。
    155             }
    156 //            demo2();
    157 
    158             function demo3(){
    159                 /*模仿extjs  store proxy之间的关系
    160                  */
    161                 //定义命名空间
    162                 var Ext = Ext || {};
    163                 Ext.data = Ext.data || {};
    164                 //建立model
    165                 Ext.data.Model = function(fields){
    166                     this.fields = fields;
    167                 }
    168                 //model模型  proxy代理
    169                 Ext.data.Store = function(model,proxy){
    170                     //数据载体
    171                     var data = [];
    172                     this.model = model;
    173                     this.proxy = proxy;
    174                     //加载数据
    175                     this.load = function(){
    176                         var d = this.proxy.request();
    177                         //数据操作
    178                         for(var i=0;i<d.length;i++){
    179                             var o = {};
    180                             for(var k=0;k<model.fields.length;k++){
    181                                 o[model.fields[k]["name"]] = 
    182                                     d[i][model.fields[k]["name"]];
    183                             }
    184                             data.push(o);
    185                         }
    186                         
    187                     }
    188                     //根据索引得到model
    189                     this.getAt = function(index){
    190                         return data[index];
    191                     }
    192                     //得到所有数据的count
    193                     this.getCount = function(){
    194                         return data.length;
    195                     }
    196                     //清除所有数据
    197                     this.removeAll = function(){
    198                         data = [];
    199                     }
    200                     //遍历
    201                     this.each = function(fn,scope){
    202                         for(var i=0;i<data.length;i++){
    203                             if(scope){
    204                                 fn.call(scope,data[i]);
    205                             }else{
    206                                 fn.call(this,data[i]);
    207                             }
    208                         }
    209                     }
    210                 }
    211                 //定义ajax的本体
    212                 Ext.Ajax = Ext.Ajax || function(){};
    213                 Ext.Ajax.prototype.request = function(type,extraParams,method,url){
    214                     //1.得到跨浏览器的xhr对象,发送请求
    215                     //2.验证请求的状态等等复杂的操作。
    216                     //3.我们认为这个本体是一个大型的复杂的对象。
    217                     //4.应该在这里使用惰性代理。
    218                     return [{'id':001,name:"extjs"},{id:"002",name:"js"}];
    219                 }
    220                 //代理类
    221                 Ext.Ajax.proxy = function(){
    222                     var ajax = null;
    223                     //构造函数
    224                     this._init = function(){
    225                         ajax = new Ext.Ajax();
    226                     }
    227                     this.request = function(type,extraParams,method,url){
    228                         this._init();
    229                         return ajax.request(type,extraParams,method,url);
    230                     }
    231                 }
    232                 //测试                
    233                 var person = new Ext.data.Model([{
    234                     name:"name"
    235                 },{
    236                     name:"id"
    237                 }]);
    238                 
    239                 var personStore = new Ext.data.Store(person,new Ext.Ajax.proxy());
    240                 
    241                 personStore.load();
    242                 alert(personStore.getCount());
    243                 alert(personStore.getAt(0).name);
    244                 personStore.each(function(model){
    245                     document.write(model.name + "<br>");
    246                 })
    247             }
    248             demo3();
    249         </script>
    250     </body>
    251 </html>
  • 相关阅读:
    docker使用常用命令:启动/重启/关闭docker
    golang 中内存模型
    【转】Linux fork操作之后发生了什么?又会共享什么呢?
    go检查channel是否关闭
    golang select case 用法
    【转】理解字节序 大端字节序和小端字节序
    【转】3种TCP连接异常的情况。
    react-window 多条列表数据加载(虚拟滚动)
    ts 中 interface 与 class 的区别
    js new一个对象的过程,实现一个简单的new方法
  • 原文地址:https://www.cnblogs.com/chengyunshen/p/7191822.html
Copyright © 2011-2022 走看看