zl程序教程

您现在的位置是:首页 >  前端

当前栏目

JavaScript设计模式学习Factory

2023-06-13 09:14:11 时间
复制代码代码如下:

/*DisplayModuleinterface.*/
varDisplayModule=newInterface("DisplayModule",["append","remove","clear"]);
/*ListDisplayclass.*/
//通过接口实现工厂,这是通过List方式显示RSS
varListDisplay=function(id,parent){//implementsDisplayModule
this.list=document.createElement("ul");
this.list.id=id;
parent.appendChild(this.list);
};
ListDisplay.prototype={
append:function(text){
varnewEl=document.createElement("li");
this.list.appendChild(newEl);
newEl.innerHTML=text;
returnnewEl;
},
remove:function(el){
this.list.removeChild(el);
},
clear:function(){
this.list.innerHTML="";
}
};
/*Configurationobject.*/
varconf={
id:"cnn-top-stories",
feedUrl:"http://rss.cnn.com/rss/cnn_topstories.rss",
updateInterval:60,//Inseconds.
parent:$("feed-readers")
};
/*FeedReaderclass.*/
varFeedReader=function(display,xhrHandler,conf){
this.display=display;
this.xhrHandler=xhrHandler;
this.conf=conf;
this.startUpdates();
};
FeedReader.prototype={
fetchFeed:function(){
varthat=this;
varcallback={
success:function(text,xml){that.parseFeed(text,xml);},
failure:function(status){that.showError(status);}
};
this.xhrHandler.request("GET","feedProxy.php?feed="+this.conf.feedUrl,
callback);
},
parseFeed:function(responseText,responseXML){
this.display.clear();
varitems=responseXML.getElementsByTagName("item");
for(vari=0,len=items.length;i<len;i++){
vartitle=items[i].getElementsByTagName("title")[0];
varlink=items[i].getElementsByTagName("link")[0];
this.display.append("<ahref=""+link.firstChild.data+"">"+
title.firstChild.data+"</a>");
}
},
showError:function(statusCode){
this.display.clear();
this.display.append("Errorfetchingfeed.");
},
stopUpdates:function(){
clearInterval(this.interval);
},
startUpdates:function(){
this.fetchFeed();
varthat=this;
this.interval=setInterval(function(){that.fetchFeed();},
this.conf.updateInterval*1000);
}
};
/*FeedManagernamespace.*/
//工厂管理器,这里可以根据传进来的参数选择具体的Display
varFeedManager={
createFeedReader:function(conf){
vardisplayModule=newListDisplay(conf.id+"-display",conf.parent);
Interface.ensureImplements(displayModule,DisplayModule);
varxhrHandler=XhrManager.createXhrHandler();
Interface.ensureImplements(xhrHandler,AjaxHandler);
returnnewFeedReader(displayModule,xhrHandler,conf);
}
};
=====================================================
另一个自行车工厂的例子:
varBicycleShop=function(){};
BicycleShop.prototype={
sellBicycle:function(model){
varbicycle=this.createBicycle(model);
bicycle.assemble();
bicycle.wash();
returnbicycle;
},
createBicycle:function(model){
thrownewError("Unsupportedoperationonanabstractclass.");
}
};
/*AcmeBicycleShopclass.*/
varAcmeBicycleShop=function(){};
extend(AcmeBicycleShop,BicycleShop);
AcmeBicycleShop.prototype.createBicycle=function(model){
varbicycle;
switch(model){
case"TheSpeedster":
bicycle=newAcmeSpeedster();
break;
case"TheLowrider":
bicycle=newAcmeLowrider();
break;
case"TheFlatlander":
bicycle=newAcmeFlatlander();
break;
case"TheComfortCruiser":
default:
bicycle=newAcmeComfortCruiser();
}
Interface.ensureImplements(bicycle,Bicycle);
returnbicycle;
};
/*GeneralProductsBicycleShopclass.*/
varGeneralProductsBicycleShop=function(){};
extend(GeneralProductsBicycleShop,BicycleShop);
GeneralProductsBicycleShop.prototype.createBicycle=function(model){
varbicycle;
switch(model){
case"TheSpeedster":
bicycle=newGeneralProductsSpeedster();
break;
case"TheLowrider":
bicycle=newGeneralProductsLowrider();
break;
case"TheFlatlander":
bicycle=newGeneralProductsFlatlander();
break;
case"TheComfortCruiser":
default:
bicycle=newGeneralProductsComfortCruiser();
}
Interface.ensureImplements(bicycle,Bicycle);
returnbicycle;
};

/*Usage.*/
复制代码代码如下:

varalecsCruisers=newAcmeBicycleShop();
varyourNewBike=alecsCruisers.sellBicycle("TheLowrider");
varbobsCruisers=newGeneralProductsBicycleShop();
varyourSecondNewBike=bobsCruisers.sellBicycle("TheLowrider");