什麼是多態:函數
其實是不一樣對象做用與同一操做產生不一樣的效果。多態的思想其實是把「想作什麼」和「誰去作「分開,多態的好處是什麼呢?爲何要多態?咱們來看看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 ); // 輸出:開始渲染搜搜地圖