js 中面向对象的多态

什么是多态:函数

  其实是不一样对象做用与同一操做产生不一样的效果。多态的思想其实是把“想作什么”和“谁去作“分开,多态的好处是什么呢?为何要多态?咱们来看看google

Martin Fowler 在《重构:改善既有代码的设计》里写到: 设计

  多态的最根本好处在于,你没必要再向对象询问“你是什么类型”然后根据获得的答 案调用对象的某个行为——你只管调用该行为就是了,其余的一切多态机制都会为你安 排稳当。 换句话说,多态最根本的做用就是经过把过程化的条件分支语句转化为对象的多态性,从而 消除这些条件分支语句 。、对象

假设咱们要编写一个地图应用,如今有两家可选的地图 API 提供商供咱们接入本身的应用。 就像咱们介入一个地图APi的调用接口

var googleMap = {
show: function () {
console.log('开始渲染谷歌地图');
}
};

var renderMap = function () {
googleMap.show();

};
renderMap(); // 输出:开始渲染谷歌地图
因为某些缘由,咱们要换一下其余的API接口,为了让 renderMap 函数保持必定的弹性, 咱们用一些条件分支来让 renderMap 函数同时支持两种地图的接口:
var googleMap = {
show: function () {
console.log('开始渲染谷歌地图');
}
};
var bdMap = {
show: function () {
console.log('开始渲染百度地图');
}
};
var renderMap = function (type) {
if (type === 'google') {
googleMap.show();
} else if (type === 'bd') {
dbMap.show();
}
};
renderMap('google'); // 输出:开始渲染谷歌地图 renderMap( 'baidu' ); // 输出:开始渲染百度地图

能够看到,虽然 renderMap 函数目前保持了必定的弹性,但这种弹性是很脆弱的,一旦须要 替换成其余的地图接口,那无疑必须得改动 renderMap 函数,继续往里面堆砌条件分支语句。  咱们仍是先把程序中相同的部分抽象出来,那就是显示某个地图:it

var renderMap = function( map ){
if ( map.show instanceof Function ){
map.show(); }
};
renderMap( googleMap ); // 输出:开始渲染谷歌地图
renderMap( bdMap ); // 输出:开始渲染百度地图

如今来找找这段代码中的多态性。当咱们向两种地图对象分别发出“展现地 图”的消息时,会分别调用它们的 show 方法,就会产生各自不一样的执行结果。对象的多态性提示咱们,“作什么”和“怎么去作”是能够分开的,即便之后增长了其余地图,renderMap 函数仍 然不须要作任何改变,以下所示: io

var sosoMap = {    show: function(){        console.log( '开始渲染搜搜地图' );    }renderMap( sosoMap ); // 输出:开始渲染搜搜地图
相关文章
相关标签/搜索