js 中面向對象的多態


什么是多態:

  實際上是不同對象作用與同一操作產生不同的效果。多態的思想實際上是把“想做什么”和“誰去做“分開,多態的好處是什么呢?為什么要多態?我們來看看

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 函數,繼續往里面堆砌條件分支語句。  我們還是先把程序中相同的部分抽象出來,那就是顯示某個地圖:

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

現在來找找這段代碼中的多態性。當我們向兩種地圖對象分別發出“展示地 圖”的消息時,會分別調用它們的 show 方法,就會產生各自不同的執行結果。對象的多態性提示我們,“做什么”和“怎么去做”是可以分開的,即使以后增加了其他地圖,renderMap 函數仍 然不需要做任何改變,如下所示: 

var sosoMap = {
show: function(){
console.log( '開始渲染搜搜地圖' );
}
renderMap( sosoMap ); // 輸出:開始渲染搜搜地圖

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM