10.Javascript設計模式之適配器模式----Adapter
適配器模式是一個非常實用的設計模式,本文將通過例子來向大家介紹這個設計模式。
適配器模式的目的:將一個類的接口轉換成客戶希望的另外一個接口。
適配器模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。 如果你想要更容易的理解的話,你可以把適配器理解成爲一箇中間件,通過它,能將兩個本來沒辦法聯繫在一起的東西確實產生聯繫。
前言
- 我有一部Nokia E63的手機,原裝機配備有容量爲2GB的內存卡,但是沒有配備數據線,我現在想從電腦上拷貝幾個軟件放到手機的內存卡中,該怎麼辦呢? 有手機,有卡,有電腦,還有我想要的軟件,但是沒有數據線,How Can I do?
- 我借朋友的數碼相機去天安門拍了很多的照片,照片都在相機的存儲卡里,但是朋友當時沒有給我數據線(-_-!!!又是沒有數據線),我怎麼才能把照片從相機裏拿出來呢?
偶也,我是一名程序猿,還好我知道有個東西叫做適配器,對於上面所說的情況,我只要在旁邊的超市買一個多口讀卡器(¥10.00),問題就完全解決了。
上面所說的讀卡器,其實就是一個使用的適配器。
適配器模式
下來,我就用程序來模擬這個適配器解決問題的全過程。
存儲卡
//定義存儲卡,其具有三個操作,一個是插入插槽(存儲卡專用插槽),一個是取出插槽,一個是保持數據 var IMemoryCard = new Interface("IMemory",["insertSlot","outSlot","saveData"]); var MemoryCard2GB = function(){ //所需插槽爲存儲卡專用插槽 this.slot = "Memory Card Slot"; }; implements(MemoryCard2GB,IMemoryCard); MemoryCard2GB.prototype = { insertSlot : function(slotPlug){ if(slotPlug.slot !== this.slot){ alert("插槽不匹配"); } else { alert("存儲卡已經插入到插槽"); } }, outSlot : function(){ alert("存儲卡已經從插槽取出"); }, saveData : function(data){ //save data... alert("存儲卡保持數據成功"); } };
Nokia E63手機
//定義諾基亞E63手機,其具有兩個操作,一個是安裝(插入)存儲卡,一個是卸載(取出)存儲卡 var INokiaE63 = new Interface("INokiaE63",["installMemoryCard","unInstallMemoryCard"]); var NokiaE63 = function(){ //存儲卡專用插槽 this.slot = "Memory Card Slot"; }; implements(NokiaE63,INokiaE63); NokiaE63.prototype = { installMemoryCard : function(memCard){ if(memCard.slot !== this.slot){ alert("手機不能識別該存儲卡"); } else { alert("手機已有存儲卡插入"); } }, unInstallMemoryCard : function(memCard){ alert("手機中的存儲卡已取出"); } };
電腦
//定義電腦,其具備三個操作,一個是連接硬件設備,一個是斷開硬件設備,一個是輸出數據到外接設備 var IComputer = new Interface("IComputer",["connectHardware","disconnectHardware","outputData"]); var Computer = function(){ //USB 2.0 插口 this.plug = "USB 2.0"; }; implements(Compute,IComputer); Computer.prototype = { connectHardware : function(usbPlug){ if(usbPlug.plug !== this.plug){ alert("這臺電腦不識別這個外來設備"); } else { //... alert("有可識別的外來設備連接到電腦"); } }, disconnectHardware : function(usbPlug){ if(usbPlug.plug !== this.plug){ alert("無法識別的外來設備"); } else { //... alert("外來設備已經安全地從電腦中移除"); } }, outputData : function(data,hardware){ if(hardware){ //這裏我們認爲,只要插口相符,就能傳輸數據 //... hardware.transData(data); //所有的外接設備都會具有這個方法 alert("數據傳輸完畢"); } } };
讀卡器
//定義讀卡器類,並且爲它安裝一個存儲卡可識別的插槽,再給它安裝一個電腦可識別的USB 2.0插頭,OK var CardReader = function(){ this.slot = "Memory Card Slot"; this.plug = "USB 2.0"; this.card = null; //卡 this.computer = null; //電腦(可以理解爲所有能讀卡的設備) }; //再爲其增加三個操作,一個用作插卡,一個用作插電腦,一個傳輸數據 CardReader.prototype = { installCard : function(card){ if(card.slot !== this.slot){ alert("插槽不匹配"); } else { this.card = card alert("存儲卡已經插入到插槽"); } }, connectComputer : function(computer){ if(computer.plug !== this.plug){ alert("USB接口不匹配"); } else { this.computer = computer; alert("有可識別的外來設備連接到電腦"); } }, transData : function(data){ //調用MemoryCard的方法,保存數據 this.card.saveData(data); } };
使用讀卡器
//存儲卡 var memCard = new MemoryCard(); //電腦 var computer = new Computer(); //讀卡器 var cardReader = new CardReader(); //把卡插入讀卡器 cardReader.installCard(memCard); //把讀卡器連接到電腦 cardReader.connectComputer(computer); //到這裏已經可以進行數據傳輸了 computer.outputData({software:"QQ2010"},cardReader);
啊,都22:30了,不能再浪費公司的電了,下班咯。
小生愚昧,文中如有闡述之不當,還請不要介懷