不多说先上一段代码(转载自《javascript设计模式与开发实践》)
//谷歌地图show方法
var googlemap = {
googlshow: function() {
console.log("谷歌地图");
}
};
//百度地图show方法
var baidumap = {
baidushow: function() {
console.log("百度地图");
}
};
//渲染地图函数
var rendermap=function(map){
if(map.show instanceof function){
map.show();
}
};
rendermap(googlemap);//输出:开始渲染谷歌地图
rendermap(baidumap);//输出:开始渲染百度地图
对于书中抛出的问题,假设每个地图api提供展示地图的方法名都是show,在实际开发中也许不会如此顺利,书中作者提出的思路是借助适配器模式来解决问题。下面是我仿照适配器模式改进的:
var googlemap = {
googlshow: function() {
console.log("谷歌地图");
}
};
var baidumap = {
baidushow: function() {
console.log("百度地图");
}
};
//适配器参数配置
var maparg = {
"googlemap": googlemap.googlshow,
"baidumap": baidumap.baidushow
};
//适配器地图
var adaptmap = {
show: function(arg) {
for (var imap in maparg) {
for (var fmap in arg) {
if (imap && fmap && maparg[imap].name==fmap) {
return maparg[imap]();
}
}
}
}
};
//只关注发出显示地图而不关注具体用哪种地图
var rendermap = function(arg) {
adaptmap.show(arg);
};
//当增加了搜搜地图,我们需要添加搜搜地图的方法以及修改适配器地图参数
//而不需要对rendermap函数进行修改
var sosomap = {
sososhow: function() {
console.log("搜搜地图");
}
};
maparg.sosomap=sosomap.sososhow;
render(sosomap);