JavaScript設計模式之門面模式原理與實現方法分析
本文實例講述了JavaScript設計模式之門面模式原理與實現方法。分享給大家供大家參考,具體如下:
外部與一個子系統的通信必須通過一個系統的一個門面對象進行,這就是門面模式。
門面模式具備如下兩個角色:
1. 門面角色
客戶端可以調用這個角色方法,此角色中有子系統的應用(知曉相關的(一個或多個)子系統的功能和責任)。本角色會將所有從客戶端發來的請求委派到相應的子系統去。
2. 子系統角色
可以同時有一個或多個子系統。每一個子系統都不是一個單獨的類,而是一些類的集合。每一個子系統都可以被客戶端直接調用(這樣客戶端代碼會多),或被門面角色調用。子系統并不知道門面的存在,對于子系統而言,門面僅僅是另一個客戶端而已。
下面我們來看一個可以提現門面模式的簡單需求:主人為自己的寵物狗辦理的相應的寵物領養證件
從這個簡單的需求中我們可以大致分析出我們需要:主人Person類和寵物狗Dog類 的一些相關信息
在下面的例子中國會涉及到接口的驗證,現在先將代碼貼出來
//(定義一個靜態方法來實現接口與實現類的直接檢驗//靜態方法不要寫出Interface.prototype ,因為這是寫到接口的原型鏈上的//我們要把靜態的函數直接寫到類層次上//定義一個接口類var Interface=function (name,methods) {//name:接口名字 if(arguments.length<2){ alert('必須是兩個參數') } this.name=name; this.methods=[];//定義一個空數組裝載函數名 for(var i=0;i<methods.length;i++){ if(typeof methods[i]!='string'){ alert('函數名必須是字符串類型'); }else { this.methods.push( methods[i]); } }};Interface.ensureImplement=function (object) { if(arguments.length<2){ throw new Error('參數必須不少于2個') return false; } for(var i=1;i<arguments.length;i++){ var inter=arguments[i]; //如果是接口就必須是Interface類型 if(inter.constructor!=Interface){ throw new Error('如果是接口類的話,就必須是Interface類型'); } //判斷接口中的方法是否全部實現 //遍歷函數集合 for(var j=0;j<inter.methods.length;j++){ var method=inter.methods[j];//接口中所有函數 //object[method]傳入的函數 //最終是判斷傳入的函數是否與接口中所用函數匹配 if(!object[method]||typeof object[method]!='function' ){//實現類中必須有方法名字與接口中所用方法名相同throw new Error('實現類中沒有完全實現接口中的所有方法') } } }}
(1)主人類(Person類)
function Person() { this.name='測試'; this.address='居住在中國'; this.getInfo=function () { return '名字'+this.name+' 地址'+this.address; }; this.learn=function () { alert('學習的方法'); } this.marray=function () { alert('marray'); } //驗證接口 Interface.ensureImplement(this,PersonDao);//驗證該類是否全部實現接口中的方法 }
(2)寵物狗(Dog類)
var DogDao=new Interface('DogDao',['getInfo','call','run']); var Dog=function () { this.name='gg'; this.getInfo=function () { return '狗狗的名字'+this.name; }; this.call=function () { }; this.run=function () {}; Interface.ensureImplement(this,DogDao);//驗證接口 }
(3)現在可以主人可以給自己的寵物狗辦理寵物領養證件了 -----客戶端代碼
第一種方法:不用門面的方式客戶端的代碼如下
function action(person,dog) { var r='GG'+new Date().getDay()+Math.floor(Math.random()*11); var str='辦證成功:編號'+r +'<br/>主人信息'+person.getInfo() +'<br>狗狗的信息:'+dog.getInfo(); return str;}document.write(action(new Person(),new Dog()));
第二種方法:使用門面模式-----將復雜的事交給門面來做,客戶端壓力可以減小
#1:門面中進行如下的處理
function facade(person,dog) { var r='GG'+new Date().getDay()+Math.floor(Math.random()*11); var str='辦證成功:編號'+r +'<br/>主人信息'+person.getInfo() +'<br>狗狗的信息:'+dog.getInfo(); this.action=function () {//相當于實例的方法 return str; }; }
#2,客戶端負責使用的代碼為
function action2(person,dog) { document.write(new facade(person,dog).action());}action2(new Person(),new Dog());
總結,我們可以看出不適用門面模式的客戶端需要處理較為復雜的業務,使用門面后,在門面中處理復雜的東西,而客戶端只需要簡單的調用即可。
一個簡單理解門面模式的圖結構:
感興趣的朋友可以使用在線HTML/CSS/JavaScript前端代碼調試運行工具:http://tools.jb51.net/code/WebCodeRun測試上述代碼運行效果。
更多關于JavaScript相關內容還可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
相關文章:
