最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

JavaScript設(shè)計模式之代理模式實例分析

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:02:13
文檔

JavaScript設(shè)計模式之代理模式實例分析

JavaScript設(shè)計模式之代理模式實例分析:本文實例講述了JavaScript設(shè)計模式之代理模式。分享給大家供大家參考,具體如下: 代理模式的定義,代理是一個對象(proxy)用它來控制目標對象的訪問。為此他要是先與目標對象相同的接口,但是他不同于裝飾者模式,它對目標對象不進行任何修改,它的目的在于延
推薦度:
導(dǎo)讀JavaScript設(shè)計模式之代理模式實例分析:本文實例講述了JavaScript設(shè)計模式之代理模式。分享給大家供大家參考,具體如下: 代理模式的定義,代理是一個對象(proxy)用它來控制目標對象的訪問。為此他要是先與目標對象相同的接口,但是他不同于裝飾者模式,它對目標對象不進行任何修改,它的目的在于延

本文實例講述了JavaScript設(shè)計模式之代理模式。分享給大家供大家參考,具體如下:

代理模式的定義,代理是一個對象(proxy)用它來控制目標對象的訪問。為此他要是先與目標對象相同的接口,但是他不同于裝飾者模式,它對目標對象不進行任何修改,它的目的在于延緩"復(fù)雜"對象的初始化時間。這樣可以在用到這個目標對象的時候再初始化他(對于單例來講更是重要)。

代理模式有兩種分類:

(1)普通代理

(2)惰性代理

具體看下面的例子

第一,普通代理模式

步驟一,接口檢驗文件的引用

//定義一個靜態(tài)方法來實現(xiàn)接口與實現(xiàn)類的直接檢驗
//靜態(tài)方法不要寫出Interface.prototype ,因為這是寫到接口的原型鏈上的
//我們要把靜態(tài)的函數(shù)直接寫到類層次上
//定義一個接口類
var Interface=function (name,methods) {//name:接口名字
 if(arguments.length<2){
 alert("必須是兩個參數(shù)")
 }
 this.name=name;
 this.methods=[];//定義一個空數(shù)組裝載函數(shù)名
 for(var i=0;i<methods.length;i++){
 if(typeof methods[i]!="string"){
 alert("函數(shù)名必須是字符串類型");
 }else {
 this.methods.push( methods[i]);
 }
 }
};
Interface.ensureImplement=function (object) {
 if(arguments.length<2){
 throw new Error("參數(shù)必須不少于2個")
 return false;
 }
 for(var i=1;i<arguments.length;i++){
 var inter=arguments[i];
 //如果是接口就必須是Interface類型
 if(inter.constructor!=Interface){
 throw new Error("如果是接口類的話,就必須是Interface類型");
 }
 //判斷接口中的方法是否全部實現(xiàn)
 //遍歷函數(shù)集合分析
 for(var j=0;j<inter.methods.length;j++){
 var method=inter.methods[j];//接口中所有函數(shù)
 //object[method]傳入的函數(shù)
 //最終是判斷傳入的函數(shù)是否與接口中所用函數(shù)匹配
 if(!object[method]||typeof object[method]!="function" ){//實現(xiàn)類中必須有方法名字與接口中所用方法名相同
 throw new Error("實現(xiàn)類中沒有完全實現(xiàn)接口中的所有方法")
 }
 }
 }
}

步驟二,目標類

(1)圖書類

//圖書類
/*
* bid 圖書id
* bName 圖書名稱
* bPrice 圖書價格
* */
var Book = function(bid,bName,bPrice){
 this.bid = bid;
 this.bName = bName;
 this.bPrice = bPrice;
}

(2)真正的目標類

//目標類
var myBookShop=(function () {
 //書店里的書
 var books={};
 return function (bks) {
 //初始化
 if(typeof bks=="object"){
 books=bks;
 }
 //加書
 this.addBook = function(book){
 books[book.bid] = book;
 }
 //找書
 this.findBook=function (bid) {
 if(books[bid]){
 return books[bid];
 }else {
 return null;
 }
 }
 //還書
 this.returnBook=function (book) {
 this.addBook(book);
 }
 //借書
 this.lendBook=function (bid) {
 var book=this.findBook(bid);
 return book;
 }
 }
})();

步驟三,普通代理

var myBookShopProxy=function (bks) {
 var obj=new myBookShop(bks);//類似于目標類的引用
 //加書
 this.addBook=function (book) {
 obj.addBook(book);
 }
 //找書
 this.findBook = function(bid){
 return obj.findBook(bid);
 }
 //還書
 this.returnBook=function (book) {
 obj.returnBook(book);
 }
 //借書
 this.lendBook=function (bid) {
 return obj.lendBook(bid);
 }
}

步驟四,添加數(shù)據(jù)后,開始訪問

var proxy = new myBookShopProxy({
 "001":new Book("001","EXTJS","45"),
 "002":new Book("002","JS","60")
})
alert(proxy.lendBook("001").bName)

在普通的代理模式中,我們可以看出代理中對目標對象的引用是一次性初始化的,然后再在該基礎(chǔ)上實現(xiàn)其他操作

如圖:目標類和代理同時實現(xiàn)了同一接口。代理中一次性對目標類進行實例,然后值訪問到目標類中的方法。

總結(jié),這個代理是我們嚴格安裝定義來寫的,一般開發(fā)中不會用到,應(yīng)為他沒什么意義。

第二種,惰性代理----在使用時才對目標類進行初始化再引用。

對代理部分的修改如下,其余部分相同,代碼如下

//惰性代理---在使用時在初始化目標類的引用
var myBookShopProxy=function (bks) {
 var obj=null;
 this._init=function () {
 obj=new myBookShop(bks);
 }
 //加書
 this.addBook=function (book) {
 this._init();
 obj.addBook(book);
 }
 //找書
 this.findBook=function (bid) {
 this._init();
 obj.findBook(bid);
 }
 //還書
 this.returnBook=function (book) {
 this._init();
 obj.returnBook(book);
 }
 //借書
 this.lendBook=function (bid) {
 this._init();
 return obj.lendBook(bid);
 }
}

修改后的代理執(zhí)行過程,如圖

更多關(guān)于JavaScript相關(guān)內(nèi)容還可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)》

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

JavaScript設(shè)計模式之代理模式實例分析

JavaScript設(shè)計模式之代理模式實例分析:本文實例講述了JavaScript設(shè)計模式之代理模式。分享給大家供大家參考,具體如下: 代理模式的定義,代理是一個對象(proxy)用它來控制目標對象的訪問。為此他要是先與目標對象相同的接口,但是他不同于裝飾者模式,它對目標對象不進行任何修改,它的目的在于延
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top