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>

 

posted @ 2017-07-16 21:11  橙云生  阅读(150)  评论(0编辑  收藏  举报