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了,不能再浪费公司的电了,下班咯。
小生愚昧,文中如有阐述之不当,还请不要介怀