天天看點

JavaScript與設計模式

  • js沒有傳統語言中的類式繼承,通過原型委托方式實作對象間的繼承
  • 面向對象三大特性:抽象、繼承、多态

1.1 動态語言和鴨子類型

  • 靜态類型語言在編譯時便已确定變量的類型,而動态類型語言的變量類型要到程式運作的時候,待變量被賦予某個值之後,才會具有某種類型。

鴨子類型

“如果它走起路來像鴨子,叫起來也是鴨子,那麼它就是鴨子。”

  1. 隻關注對象行為,不關注對象本身。
  2. 故動态語言不必借助超類型幫助,實作面向接口程式設計

1.2 多态

what:将“做什麼”和“誰去做以及怎麼去做”分離開

why:給予了我們擴充程式的能力,程式看起來是可生長的,也符合開放-封閉原則。

How:即将不變的事物和可能改變的分離開。

example 1:使動物叫

在例子中,不變的部分是動物都會發出叫的動作,會變的是,動物的叫聲不同。故程式可以分為兩個部分。

function makeSound(animal){  
 animal.sound && animal.sound()  
}  
​  
// 改變的部分  
var Duck = function (){}  
Duck.prototype.sound = function (){  
 console.log('gagaga')  
}  
var Dog = function(){}  
Dog.prototype.sound = function(){  
 console.log('wangwangwang')  
}
           

// 不變的部分

上文談到的多态實質上指的是對象的多态性。

Martin Fowler 在《重構:改善既有代碼的設計》裡寫到:

多态的最根本好處在于,你不必再向對象詢問“你是什麼類型”而後根據得到的答案調用對象的某個行為——你隻管調用該行為就是了,其他的一切多态機制都會為你安排妥當。

  1. JavaScript 的變量類型在運作期是可變的。一個 JavaScript 對象,既可以表示 Duck 類型的對象,又可以表示 Chicken 類型的對象,這意味着 JavaScript 對象的多态性是與生俱來的。
  2. 多态最根本的作用就是通過把過程化的條件分支語句轉化為對象的多态性,進而消除這些條件分支語句。

example 2:調用地圖Api

在本例子,會改變的是Api提供商,不變的是進行地圖渲染的動作

//使用不同地圖api進行渲染  
​  
//不變的是渲染行為  
var render = function(map){  
 if(map.show instanceof Function){  
 map.show()  
 }  
}  
//變的是 api提供者  
var gooleMap = {  
 show:function(){  
 console.log('gooleMap進行渲染')  
 }  
}  
​  
var baiduMap={  
 show:function(){  
 console.log('baiduMap進行渲染')  
 }  
}
           

設計模型與多态

  • 絕大部分設計模式的實作都離不開多态性的思想
  • 在JavaScript中函數是一等對象,

1.3 封裝

封裝的目的是将資訊隐藏。一般而言,我們讨論的封裝是封裝資料和封裝實作。這一節将讨論更廣義的封裝,不僅包括封裝資料和封裝實作,還包括封裝類型和封裝變化。

1.3.1 封裝資料

  • 許多對象系統中,封裝資料由文法解析實作,例如private、public等
  • js依靠變量的作用域實作封裝特性,且隻能模拟public和private

可使用let和函數來建立作用域

1.3.2 封裝實作

從封裝實作細節來講,封裝使得對象内部的變化對其他對象而言是透明的,也就是不可見的。

1.3.3 封裝類型

封裝類型是靜态類型語言中一種重要的封裝方式。一般而言,封裝類型是通過抽象類和接口來進行的。把對象的真正類型隐藏在抽象類或者接口之後

在Javascript中,沒有對抽象類和接口的支援,也沒有能力進行類型封裝。

1.3.4 封裝變化

《設計模式》一書曾提到如下文字:

“考慮你的設計中哪些地方可能變化,這種方式與關注會導緻重新設計的原因相反。它不是考慮什麼時候會迫使你的設計改變,而是考慮你怎樣才能夠在不重新設計的情況下進行改變。這裡的關鍵在于封裝發生變化的概念,這是許多設計模式的主題。”

設計模式劃分為建立型模式、結構性模式、行為型模式

  1. 建立型模式: 建立對象是一種抽象行為,即建立什麼對象是可以變化的。即封裝建立對象的變化
  2. 結構性模式: 封裝對象間的組合關系
  3. 行為型模式:封裝對象的行為變化

在系統演變中,隻需替換可變的部分,因為已經封裝好,故替換起來相對容易。最大程度地保證程式地穩定性和可擴充性

繼續閱讀